Nginx介绍
D
简单介绍
WSGI:Web网关接口(W web、S server、G gateway、I interface)俗称:web容器,web服务器。
例如:比如一台WSGI Server可以支撑1万的访问量,Nginx后面挂三个WSGI Server就可以支撑3万。
例如:可以做负载均衡,第一个请求落在WSGI SERVER 1上,第二个请求落在2上,依次负责请求。
说明:客户端(用户)发送请求来访问 Flask app应用,首先是访问到Nginx服务器软件上面,Nginx后面可能会有多个 WSGI SERVER 做反向代理和负载均衡。
python代码是不能直接交给Nginx上运行的( Nginx不知道如何执行python代码,它知道如何管理图片和静态HTML) 正是因为Nginx不知道如何执行我
们的python程序,我们的python代码是在WSGI SERVER中执行的,WSIG SERVER才是我们真正的web服务器(可能会有多个python代码服务WSGI
SERVER),WSGI SERVER执行完后会返回HTTP响应,HTTP响应会交给Nginx,Nginx再去交给客户端。
注意:Nginx服务器软件是一款无论你使用说明语言开发程序都可以使用的服务器软件,性能非常强悍,用户多社区活跃,出问题情况安全漏洞少。
而uWSGI是支持python语言开发的服务器,也可以支持一些其他语言,但是用户量非常少。虽然性能还可以,但是用户量少、社区不活跃,
所以没有Nginx成熟,所以Nginx是一款非常成熟、稳妥的选择。所以在工作中都会选择Nginx放在最外层接受用户的请求,Nginx接受完请求
后,Nginx再把请求转发给真正的去运行我们python代码程序的服务器uWSGI,然后其去执行我们的python代码。
工作原理:「正向代理:隐藏了用户的细节;反向代理:隐藏了服务器的细节」
Nginx做HTTP服务器如蓝线所示,直接对接管理的是静态资源;Nginx做反向代理服务器如绿线所示,对接的是另外的服务器,Nginx只是做请求的转发处理
工作流程:
-
-
生产模式:浏览器(chrome) <===> 反向代理服务器(Nginx) <=> WSGI服务器(uWSGI)
- 工作流程:用户的请求访问到Nginx上面,Nginx会对后面的业务做负载均衡,反向代理。其后面可能会有多个python代码服务与其对接
Python程序是不能直接在Nginx执行的,所有需要我们的Python程序在WSGI SERVER容器中去完成执行的,执行完后返回响应交个
Nginx,执行完的python程序交个Nginx后,再由Nginx去返回给我们的客户端去响应
- 环境冻结:pip freeze > requirements.txt [将当前项目所使用的依赖包列表(包名及版本号)保存到requirements.txt中]
- 环境迁移:pip install -r requirements.txt [安装 requirements.txt 中所列举的依赖包]
- 代码迁移:将本地代码放到LInux云服务器的/var/www/目录下
Nginx安装
安装
- mkdir pgp_key 创建一个pgp_key文件目录
- cd pgp_key/ 进入到该目录下
- wget wget http://nginx.org/keys/nginx_signing.key 下载pgp_key公钥
- sudo apt-key add nginx_signing.key 添加Nginx源为信任[添加公钥]
- sudo vim /etc/apt/sources.list 打开/etc/apt/sources.list文件并编辑,添加元信息
- 将如下两行内容添加到打开的文件中末行(xenial是对应系统版本名字)
- deb http://nginx.org/packages/ubuntu/ xenial nginx
- deb-src http://nginx.org/packages/ubuntu/ xenial nginx
- sudo apt update 更新源信息
- sudo apt install nginx 安装nginx
查看:
- ps -ef | grep nginx 查看nginx是否在运行,默认安装完后不会自动启动
- nginx [-c configpath] 启动nginx。方括弧代表可选配置
Nginx控制
- 启动nginx:sudo nginx
- nginx启动后默认会有两个进程:master process(主进程)和worker process(从进程)
- 杀死从进程后,主进程会自动分配一个新的从进程。
- 杀死主进程后,如果从进程没有工作任务,会和主进程一起杀死
- 查看nginx信息:
- ps -ef | grep nginx (查看nginx进程状态)
- nginx -v (显示nginx的版本信息)
- nginx -V (显示nginx构建过程中的所有参数配置)
- 控制nginx:
- nginx -s signal
- sudo nginx -s stop: 快速关闭
- sudo nginx -s quit: 优雅关闭[推荐使用]
- sudo nginx -s reload:重新加载配置
- 通过系统命令控制nginx
- systemctl status nginx: 查看nginx状态
- systemctl start nginx: 启动nginx服务
- systemctl stop nginx: 关闭nginx服务
- systemctl enable nginx:设置开机自启
- systemctl disable nginx:禁止开机自启
- 不建议使用,nginx会加载配置文件参数,这种方式不能控制配置文件参数,容易出现未知错误
配置信息
Nginx配置文件内包含指定指令控制的模块。指令分为简单指令和块指令。一个简单指令由名称和参数组成以空格分隔并以分号结尾;一个块指令和简单指令具有相同的结构,但不是以分号结束而是以一个大括号包围的一堆附加指令结束。如果一个大括号内可以有其他的指令,它就被称为一个上下文,比如(events,http,server,location)
配置文件结构:
- main
- events
- http
- server
- location
配置文件详情: [两层文件配置方式,用include去包含下一层]
-
cd /etc/nginx/
-
ls [内有nginx.conf文件]
-
vim nginx.conf
配置文件信息 [可在项目的目录下配置一个配置文件,将两个配置文件合并]
- root配置家目录信息写在location配置匹配信息的外层,让所有路由使用一个家目录。方便之后调整
- alais 别名匹配,将前面的内容直接映射到文件系统中。配置所有的路径信息
注意:此配置是在/var/Love/路径下访问静态资源,如果访问不到就去请求转发到uwsgi服务器,由uWSGI提供请求服务
测试指令:
- 对Nginx配置文件进行测试的指令
- nginx -t:不运行仅测试默认配置文件
- nginx -c configpath :从指定路径加载配置文件进行启动。configpath最好写成绝对路径
- nginx -t -c configpath :测试指定配置文件,并不会关闭服务器也不会真正加载配置文件,只会检测配置语法是否正确
Nginx管理静态文件
Nginx代理转发请求
可以用Nginx直接代理转发Django用runserver运行起来的项目请求
说明:
配置:
- python manage.py runserver 9000 用runserver启动项目端口是9000
- location / { # config.conf配置文件中做反向代理
- proxy_pass http://127.0.0.1:9000;
- }
- ps -ef | grep nginx 查看nginx状态
- sudo nginx -s quit 关闭nginx
- nginx -t -c /var/www/项目名/config.conf 测试配置的文件[写配置文件的绝对路径],返回显示ok即可
- nginx -c /var/www/项目名/config.conf 启动nginx重新加载新配置的配置文件[写配置文件的绝对路径]
uWSGI启动程序
安装:实现了WSGI协议的Web服务器,使用uWSGI启动Flask或Django应用
将项目上传到服务器:/var/www/ 目录下
打包项目依赖包文件:pip freeze > requirements.txt
创建虚拟环境:python3 -m venv .venv
进入虚拟环境:source .venv/bin/activate
安装依赖文件:pip install -r requirements.txt [requirements.txt内存的是在开发环境时项目的依赖包名]
安装此uWSGI:pip install uwsgi [在Linux虚拟机或阿里云服务器上新的的虚拟环境中安装]
测试:从最外层向里层[Python程序(Flask)=>WSGI服务器(uWSGI) 反向代理服务器(Nginx)]一层一层进行测试运行
首先测试python代码是否可以正常运行:python manage.py runverser -h 0.0.0.0 -p 5000 [远程服务器运行起来程序后本地也可以访问]
然后测试uWSGI是否能运行python代码:uwsgi --http 0.0.0.0:5000 --module manage:app [远程服务器运行起来程序后本地也可以访问]
启动:实现了WSGI协议的Web服务器,使用uWSGI启动Flask应用
以HTTP方式启动:一般真实部署不会用此方式。但此方式可以直接用浏览器访问。
-
- uwsgi --http 127.0.0.1:5000 --module manage --callable app
- uwsgi --http 0.0.0.0:5000 --module manage:app
- uwsgi:是启动命令;
- --http 0.0.0.0:5000:是提供http服务,这个服务监听在0.0.0.0ip上并且监听5000端口
- --module:表示执行哪一个应用,如上是执行manage项目模块中的app项目对象的代码
-
- uwsgi --socket 127.0.0.1:5000 --module manage --callable app
- uwsgi --socket 127.0.0.1:5000 --module manage:app
配置:
-
- --http 以HTTP方式启动软件,可以通过浏览器访问。监听ip及端口:127.0.0.1:5000
- --socket 以socket方式启动软件,它是Tcp协议不能通过浏览器的Http协议访问。监听ip及端口:127.0.0.1:5000
- --chdir 项目目录
- --module 指定WSGI模块
- --callable 指定应用程序
- --daemonize 指定后台启动的日志文件[把日志信息输出到一个文件中去]
- --processes 指定启动进程数
- --threads 指定启动线程数
启动:
项目中真实启动方式是在项目目录下创建 uwsgi.ini脚本文件:vim uwsgi.ini
在uwsgi.ini文件中编辑如下配置信息:
-
- [uwsgi]
- socket = 127.0.0.1:5000 表示:--socket,以socket方式启动。也可以是http = 127.0.0.1 : 5000以http方式启动
- module = manage 表示:--module
- callable = app 表示:--callable
- daemonize = /var/log/uwsgi.log 表示:会在/var/log/目录下创建一个uwsgi.log文件,程序在后台启动后会把日志信息打印到此文件中
- uwsgi.ini
配置文件(uwsgi.ini文件)方式启动uwsgi(socket):uwsgi --ini uwsgi.ini
启动完毕后查看/var/log/uwsgi.log日志文件检查是否有报错信息:cat /var/log/uwsgi.log 或者:tail -f /var/log/uwsgi.log
注意:
以上此方式启动无法使用浏览器访问程序,因为以socket启动是tcp协议,
浏览器是http协议,所以需要Nginx做反响代理才可以正常访问启动的程序
- uwsgi --stop uwsgi.pid 关闭uwsgi
- uwsgi --ini uwsgi.ini 开启uwsgi
Nginx对接uWSGI
进入Nginx外层配置文件
- 进入配置文件目录:cd /etc/nginx/
- 其目录内有一个配置文件vim进入:vim nginx.conf
- 会有如下配置信息,默认情况下Nginx会从两个位置加载配置文件。
- 一般配置会放到/etc/nginx/conf.d/*.conf内,为了和Centos相同。
- # Virtual Host Configs 虚拟主机配置。
- include /etc/nginx/conf.d/*.conf;
- include /etc/nginx/sites-enabled/*;
进入Nginx内层配置文件
- 进入配置文件的目录:cd [/etc/nginx/]conf.d/
- 创建并编辑配置文件:vim toutiao.conf
- 编辑配置Nginx将动态请求转发到uWSGI服务器上
Nginx转发(HTTP)uWSGI服务器
检出Nginx是否有语法错误 :nginx -t [如果显示syntax is ok说明没问题]
Nginx对接gunicorn
安装配置:Gunicorn + Gevent
- pip install gunicorn gevent 安装Gunicorn和Gevent
touch /gunicorn.conf.py 新建配置文件
- workers = 5 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
- worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量
- bind = "0.0.0.0:8080"
- gunicorn start:app -c gunicorn.conf.py 打开网址
127.0.0.1:8080
使用gunicorn命令来测试是否可以正确运行。
对接Nginx :
- location / { # config.conf配置文件中做反向代理到gunicorn
- proxy_pass http://127.0.0.1:8080;
- }
- sudo nginx -s reload 重启一下nginx
负载均衡
- netstat -tlnp :查看端口占用情况[用此命令可以去确认程序是否在运行]
- killall uwsgi :杀死所有uWSGI进程
配置:在config.conf配置文件中的http{....}模块中配置如下信息
转发: 也是在http{....}模块中location转发信息
- location / {
- proxy_pass http://myproject; # 转发,直接交给负载均衡模块,由负载均衡模块的算法进行分发
- }
- sudo nginx -s reload 重启一下nginx
测试
配置测试
- 保存退出配置文件后
- nginx -s quit 退出nginx
- nginx -t -c /var/www/项目名/config.conf 测试配置的文件[写配置文件的绝对路径],返回显示ok即可
- nginx -c /var/www/项目名/config.conf 启动nginx重新加载新配置的配置文件[写配置文件的绝对路径]
压力测试
- ab:apachebench 压力测试工具
- apt-get install apache2-utils 下载
- ab 需要测试页面的地址 进行测试
- ab -n 100 需要测试页面的地址 进行100次测试
比较