linux项目部署学习(3) -nginx/部署django项目crm
4.nginx
为什么要用nginx uwsgi?
1 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx, 2nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件, 如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。 3要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况 1 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。 2负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。 3静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。
nginx安装
需要装2个虚拟机 nginx 官方nginx tenginx 淘宝nginx 这两个一模一样,淘宝的nginx,官方文档更详细 注意,编译软件之前,还是要解决系统的开发环境,例如如下, yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y 1.进入淘宝的nginx官网,下载源代码,进行编译安装 http://tengine.taobao.org/index_cn.html 2.在linux的opt目录下,下载nginx源代码 wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz 3.解压缩源代码,准备编译三部曲 tar -xzvf tengine-2.3.2.tar.gz 4.进入源码目录,指定nginx的安装位置 ./configure --prefix=/opt/tngx232/ 5.编译且安装,生成nginx的可执行命令目录 make && make install 6.安装后,会生成/opt/tngx232/目录,nginx可以使用的配置都在这里了, conf 存放*.conf配置文件的 html 存档网页的静态文件的目录 logs 日志 sbin 存放nginx的可执行命令 7.添加nginx到PATH中,可以快捷的执行命令 [root@VM-0-6-centos sbin]# pwd /opt/tngx232/sbin 永久修改PATH,开机就会去读取 vim /etc/profile source /etc/profile 8.首次启动nginx,注意要关闭防火墙 nginx #首次输入是直接启动,不得再次输入 nginx -s reload #平滑重启,重新读取nginx的配置文件,而不重启进程 nginx -s stop #停止nginx进程 nginx -t #检测配置文件 9.默认方位的nginx首页站点的url是 http://123.207.198.150:80/index.html ps:如果你想删除编译安装的软件(如:nginx) 1.删除PATH vim /etc/profile 2.删除编译安装后的软件包即可
安装完成后检测服务
netstat -tunlp |grep 80 #默认80端口 curl -I ip #如果访问不了,检查selinux,iptables
nginx目录结构
conf 存放nginx所有配置文件的目录,主要nginx.conf html 存放nginx默认站点的目录,如index.html、error.html等 logs 存放nginx默认日志的目录,如error.log access.log sbin 存放nginx主命令的目录,sbin/nginx
nginx的web站点功能
也称为nginx的虚拟主机站点配置
指的就是在nginx中,能够通过文件目录的不同,分割出不同的网站
1.如何修改nginx的首页内容 [root@VM-0-6-centos html]# ls vi index.html 2.设置个人站点,放一些图片 [root@VM-0-6-centos html]# ls 50x.html 55kai.jpg index_bak.html index.html
nginx的配置文件学习
nginx的配置文件是c语言代码风格 以; 表示每一行的配置结束 nginx.conf中 以代码块形式编写的 例如 主要的几个代码块 http{} #里面定义了多个代码,是nginx的核心功能配置点 server{} #虚拟主机代码块,定义类网站的域名,以及首页文件名字,监听端口等功能 location{} #域名匹配代码块
配置文件详解 (选中{,按shift+5,可以找到另一个括号})
[root@VM-0-6-centos conf]# cat nginx.conf #这里是全局作用域 user nobody; ##Nginx进程所使用的用户 worker_processes 1;#定义nginx的工作进程,以cpu核数为准,单核写1 error_log logs/error.log; ##Nginx错误日志存放路径 #error_log logs/error.log notice; #error_log logs/error.log info; #error_log "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G"; #pid logs/nginx.pid; ##Nginx服务运行后产生的pid进程号,之前是通过ps -ef 获取nginx的进程id,现在把pid写到nginx的配置文件,默认会写到nginx.pid文件,后续可以获取 events { worker_connections 1024; //每个worker进程支持的最大连接数 use epool; //事件驱动模型, epoll默认 } #这个http区域,是nginx的核心功能区域,公共的配置定义在http{} #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { include mime.types; default_type application/octet-stream; #打开次nginx的访问日志功能,即可查看日志 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; #access_log "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G" main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #nginx开启静态资源压缩,比如nginx返回磁盘的html文件特别大,里面包含了诸多的js css,图片,一个html文件达到4M大小。打开后会压缩到几百K。 gzip on; #提供静态资源缓存功能,第一次访问过网页之后,nginx能够让图片js等静态资源,缓存到游览器上,游览器下次访问网站,速度几乎就是秒开了。 //使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机) server { listen 80; //监听端口, 默认80 server_name localhost; //提供服务的域名或主机名 access_log host.access.log; //访问日志 charset utf-8; //控制网站访问路径,所有的请求都会进入到这里 location / { root html; //存放网站代码路径 index index.html index.htm; //服务器返回的默认页面文件 } //指定错误代码,去上面指定的html路径下找404.html, 统一定义错误页面, 错误代码重定向到新的Locaiton error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } //第二个虚拟主机配置 server { ... } include /etc/nginx/conf.d/*.conf; //包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件 }//http层结束
nginx的多站点功能(多虚拟主机)
-
基于域名的多虚拟机
-
修改hosts文件,强制写入域名对应关系
-
-
基于端口的多虚拟机
-
修改nginx.conf配置文件,定义2个server{listen xx }即可 -
[root@VM-0-6-centos opt]# nginx -t nginx: the configuration file /opt/tngx232//conf/nginx.conf syntax is ok nginx: configuration file /opt/tngx232//conf/nginx.conf test is successful -
nginx -s reload #平滑重启
-
Nginx状态信息(status)配置
Nginx状态信息(status)配置及信息详解 nginx与php-fpm一样内建了一个状态页,对于想了解nginx的状态以及监控nginx非常有帮助。为了后续的zabbix监控,我们需要先了解一下nginx的状态页。 Nginx状态信息(status)介绍 Nginx软件在编译时又一个with-http_stub_status_module模块,这个模块功能是记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态。 要想使用状态模块,在编译时必须增加--with-http_stub_status_module参数。
监测你的nginx是否安装了status模块
[root@master conf]# /opt/nginx/sbin/nginx -V nginx version: nginx/1.12.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) configure arguments: --prefix=/opt/nginx/ --with-http_stub_status_module
启动status状态功能,修改配置文件
#在访问ip/status的时候,进入状态功能 location /status { #开启nginx状态功能 stub_status on; }
平滑重启nginx
nginx -s reload
访问status页面
通过ab压测命令检测
yum -y install httpd-tools
-n requests #执行的请求数,即一共发起多少请求。
-c concurrency #请求并发数。
-k #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。
ab -kc 1000 -n 100000 http://192.168.119.10/
status页面解析
nginx的404优化
1.在nginx的配置文件中加error_page参数 location / { root html; //存放网站代码路径 index index.html index.htm; //服务器返回的默认页面文件 } //指定错误代码,去上面指定的html路径下找404.html, 统一定义错误页面, 错误代码重定向到新的Locaiton error_page 404 /404.html; 2.nginx -t 3.nginx -s reload
nginx的访客日志
nginx的访客日志,能够记录分析用户的请求行为 -什么时间点,访问的最频繁,比如路飞的网站,网站的流量,基本都在晚上 -记录用户的请求频率,以此检测是否爬虫等恶意请求,进行封禁 -检测躲在代理ip后的 真实的用户ip -检测用户ip 请求时间 请求url等
如何配置?
#打开次nginx的访问日志功能,即可查看日志 #记录日志的格式,可定义多种格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main;#指定日志文件的路径以及格式
对应参数解析
$remote_addr 记录客户端ip $remote_user 远程用户,没有就是 “-” $time_local 对应[14/Aug/2018:18:46:52 +0800] $request 对应请求信息"GET /favicon.ico HTTP/1.1" $status 状态码 $body_bytes_sent 571字节 请求体的大小 $http_referer 对应“-” 由于是直接输入浏览器就是 - $http_user_agent 客户端身份信息,用此nginx可以判断,客户端是手机游览器,还是pc的客户端,转发给相对应的界面。 $http_x_forwarded_for 记录客户端的来源真实ip 97.64.34.118
访客日志信息: 120.244.48.91 - - [28/Jun/2020:16:09:16 +0800] "GET /js/jquery.min.js HTTP/1.1" 404 203 "http://123.207.198.150/121" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
nginx限制网站来源IP访问
如果哪天发现你的nginx很慢,或者检查access.log时候,有一个some body疯狂请求你的nginx server,那么可以禁止这个IP访问 限制ip或ip段访问 禁止访问/av/底下的资源 location /av { deny 122.71.240.254; #alias /opt/nginx1-12/html/av; allow 10.1.1.0/16; }
nginx的反向代理与负载均衡
正向代理
正向代理,也就是传说中的代理,他的工作原理就像一个跳板(VPN),简单的说:
我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
反向代理
对于客户端而言,代理服务器就像是原始服务器。
nginx实现负载均衡的组件
ngx_http_proxy_module proxy代理模块,用于把请求抛给服务器节点或者upstream服务器池
实现一个简单的反向代理
机器准备,两台服务器
master xxxx 主负载 slave xxx web1
由于只有一台服务器,所以下面利用nginx的多虚拟主机功能实现反向代理
upstream proxy_85_90{ server http://123.207.198.150:85; server http://123.207.198.150:90; } server { listen 80; server_name localhost; location / { proxy_pass http://proxy_85_90; #root index; #gzip on; upstream proxy_85_90{ server 123.207.198.150:85; server 123.207.198.150:90; } server { listen 80; server_name localhost; location / { proxy_pass http://proxy_85_90; #root index; #index index.html index.htm; } #error_page 500 502 503 504 /50x.html; #location = /50x.html { # root html; #} } server { listen 85; server_name localhost; location / { root /opt/tngx232/html/python85; index index.html index.htm; } #error_page 500 502 503 504 /50x.html; #location = /50x.html { # root html; #} }
nginx负载均衡算法
#负载均衡配置 upstream jh.w3cschool.cn { #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 server 192.168.80.121:80 weight=3; server 192.168.80.122:80 weight=2; server 192.168.80.123:80 weight=3; #nginx的upstream目前支持4种方式的分配 #1、轮询(默认) #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 #2、weight #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 #例如: #upstream bakend { # server 192.168.0.14 weight=10; # server 192.168.0.15 weight=10; #} #2、ip_hash #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 #例如: #upstream bakend { # ip_hash; # server 192.168.0.14:88; # server 192.168.0.15:80; #} #3、fair(第三方) #按后端服务器的响应时间来分配请求,响应时间短的优先分配。 #upstream backend { # server server1; # server server2; # fair; #} #4、url_hash(第三方) #按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 #例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法 #upstream backend { # server squid1:3128; # server squid2:3128; # hash $request_uri; # hash_method crc32; #} #tips: #upstream bakend{#定义负载均衡设备的Ip及设备状态}{ # ip_hash; # server 127.0.0.1:9090 down; # server 127.0.0.1:8080 weight=2; # server 127.0.0.1:6060; # server 127.0.0.1:7070 backup; #} #在需要使用负载均衡的server中增加 proxy_pass http://bakend/; #每个设备的状态设置为: #1.down表示单前的server暂时不参与负载 #2.weight为weight越大,负载的权重就越大。 #3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误 #4.fail_timeout:max_fails次失败后,暂停的时间。 #5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。 #nginx支持同时设置多组的负载均衡,用来给不用的server来使用。 #client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug #client_body_temp_path设置记录文件的目录 可以设置最多3层目录 #location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡 }
5.正式发布python-web crm项目
参考 : https://www.cnblogs.com/pyyu/p/9842878.html
nginx有关uwsgi模块介绍
http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html
发布CRM你将使用以下软件
- nginx
- uWSGI
- CentOS7
- CRM项目文件
- virtualenv
- supervisor
1.配置启动uwsgi.ini,启动uwsgi时候,用这个配置文件启动(用的unix-socket连接的nginx和uwsgi)
(venv) [root@yugo /data 11:14:25]#cat uwsgi.ini [uwsgi] #使用nginx连接时使用 socket=0.0.0.0:8000 #不用nginx直接当做web服务器使用 #http=0.0.0.0:9000 #项目目录绝对路径 chdir=/data/Ace_crm #wsgi文件路径,在项目底下 wsgi-file=Ace_crm/wsgi.py #指定解释器目录 home=/data/venv processes=4 threads=2 master=True pidfile=uwsgi.pid daemonize=uwsgi.log
2.修改nginx.conf文件,请求转发给后台
server { listen 80; server_name localhost; charset utf-8; error_page 404 /40x.html; #这里是location路径匹配,如果你写的是root参数,就是一个web站点功能 #基于uwsgi协议的一个高性能的反向代理转发,新的参数 location / { #请求发给80端口时,通过uwsgi_pass把请求转发给后端的uwsgi服务器 uwsgi_pass 0.0.0.0:8000; #这个参数时固定的,时添加一些转发请求内容 include uwsgi_params; #一些头文件 } }
3.supervisor启动uwsgi和django,以及重启nginx
注意:要先杀死supervisord/uwsgi ps -ef | grep supervisor ps -ef | grep uwsgi kill -9 28566 pkill -9 uwsgi
在重启
supervisord -c /etc/supervisord.conf nginx -s reload
4.还得配置nginx接受所有的django的静态资源文件(让nginx去处理静态文件html css,不经过后端django)
nginx找到crm的静态文件的原理图
1.修改django中settings.py STATIC_ROOT='/S25static/' #定义一个统一管理的目录,收集所有的crm静态文件 2.用命令收集静态文件(注意:要是创建了虚拟环境,肯定要激活虚拟环境执行命令的) python3 manage.py collectstatic 3.通过nginx去找到如下的静态资源即可
此时nginx.conf的配置
server { listen 80; server_name localhost; charset utf-8; error_page 404 /40x.html; #这里是location路径匹配,如果你写的是root参数,就是一个web站点功能 #基于uwsgi协议的一个高性能的反向代理转发,新的参数 location / { #请求发给80端口时,通过uwsgi_pass把请求转发给后端的uwsgi服务器 uwsgi_pass 0.0.0.0:8000; #这个参数时固定的,时添加一些转发请求内容 include uwsgi_params; #一些头文件 } #对静态文件的匹配可以这么写 #当请求进来时(192.168.178.143/static/css),告诉nginx去linux的/s25static目录下去找文件。 location /static { alias /s25static; #alias别名的意思 } }
这样访问网站就可以看到界面了(默认http 80端口),nginx静态文件自己处理,动态的需要访问数据库的,nginx转发到8000端口,给后端处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)