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端口,给后端处理。