部署 --- Nginx

Nginx介绍

  Django框架有自带的开发者服务器runserver虽然功能健壮,但性能是比较低仅适用于开发环境。在真实部署中不会像django中runserver那样使用单一服务器。而是用Nginx的HTTP服务器处理静态资源或tcp服务处理请求服务,或者做反向代理和uWSGI(HTTP服务器)、gunicorn(HTTP服务器)对接。也可以做邮件服务器或流媒体服务器。Nginx特点是:Nginx是一款高性能的Web和反向代理服务器。具有占用内存少并发能力强的优势。在同类型的网页服务器中表现十分优秀。具有反向代理、负载均衡、管理静态文件等功能。默认单台连接数5万[如果是做反向代理服务器则性能大约下降3/4]。Nginx相比Apache使用资源更少,支持更多的并发连接体现出更高的效率,能够支持高达5万个并发连接数的响应;Nginx既可以在内部直接支持Redis和PHP,也可支持作为HTTP代理服务器对外进行服务,Nginx使用C编写不论是系统资源开销还是CPU使用效率都处理的非常优秀;Nginx安装简单、配置文件简洁、Bug少、启动容易,且几乎可以做到7 * 24小时不间断运行,即使运行数个月也不需要重新启动,还可以在不间断服务的情况下进行软件版本的升级 

简单介绍

  WSGI:Web网关接口(W web、S server、G gateway、I interface)俗称:web容器,web服务器。

  Nginx 也是一个服务器软件,可以做:反向代理,负载均衡。Nginx 背后可以有多个 WSGI 服务器。

  例如:比如一台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) <===> 开发服务器(Flask WSGI Server/runserver)        <=> Python程序(Flask) <===> 数据库(MySQL)

  • 生产模式:浏览器(chrome) <===> 反向代理服务器(Nginx) <=> WSGI服务器(uWSGI) <=> Python程序(Flask) <===> 数据库(MySQL)

  • 工作流程:用户的请求访问到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安装

安装

步骤:

  • cd ~ 回到家目录 
  • 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

  

  • cd /etc/nginx/conf.d/  

  • vim default.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项目对象的代码

  socket 方式启动:一般真实部署时使用此方式,但是不能直接用浏览器访问因为它是tcp协议的。

    • 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转发(TCP)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 -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次测试

 比较 

    

posted @ 2019-12-25 16:58  Tom's  阅读(290)  评论(0编辑  收藏  举报