Nginx+gunicorn项目部署

时间:2022-12-21 08:26:58

  当写完项目之后,经常需要将项目部署到网络服务器上,以便于可以随时进行访问(注意:项目部署之前要将debug改成false)。

  一般来说,部署项目到服务器需要使用中间代理服务器,一般我们使用Nginx。作为We服务器:相比Apache,Nginx使用资源更少,支持更多的并发连接,体现更高的效率,使Nginx倍受欢迎,能够支持高达50000个并发连接数的响应。作为负载均衡服务器:Nginx既可以在内部直接支持Redis和PHP,也可以支持作为HTTP代理服务器对外进行服务,Nginx使用C编写,不论是系统资源开销还是CPU使用效率都处理的非常优秀。Nginx安装非常简单,配置文件非常简洁,Bug非常少:Nginx启动非常容易,并且几乎可以做到24小时不间断运行,即使运行数个月也不需要重新启动。

  gunicorn是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器,,使用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。

为什么要同时使用nginx和gunicorn?

  gunicorn 可以单独提供服务,但生产环境一般不这样做。首先静态资源会占用不少的请求资源,而对于 gunicorn 来讲它本身更应该关注实际业务的请求与处理而不应该把资源浪费在静态资源请求上;此外,单独运行 gunicorn 是没有办法起多个进程多个端口来负载均衡的。nginx 的作用就是弥补以上问题,首先作为前端服务器它可以处理一切静态文件请求,此时 gunicorn 作为后端服务器,nginx 将会把动态请求转发给后端服务器,因此我们可以起多个 gunicorn 进程,然后让 nginx 作均衡负载转发请求给多个 gunicorn 进程从而提升服务器处理效率与处理能力。最后,nginx 还可以配置很多安全相关、认证相关等很多处理,可以让你的网站更专注业务的编写,把一些转发规则等其它业务无关的事情交给 nginx 做。

  supervisor这东西,其实就是用来管理进程的。相对于我们linux传统的进程管理方式来说,它有很多的优势,如简单、精确、可扩展,集中式管理等等。

 

一、配置Nginx:

1、首先需要安装Nginx:sudo apt install nginx

2、在/etc/nginx/conf.d 目录下新建一个你的配置文件,如nignx.conf

3、在创建的配置文件中加入以下配置

Nginx+gunicorn项目部署Nginx+gunicorn项目部署
server{
    listen 80;
    server_name 47.94.225.12;    #写你的域名或者IP
    location / {
      proxy_pass http://127.0.0.1:12345;    #Django服务使用的端口
      proxy_set_header Host $host;    #捕获客户端真实IP
      proxy_set_header X-Real-IP $remote_addr;     #$remote_addr 代表客户端IP
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
    location /static {
    alias  /home/wusir/hz_python/django_test/axf_1806/static;  #静态文件路径
    }
}
Nginx配置文件

4、配置完成后,重启Nginx,执行 :sudo nginx -s reload 

 

二、配置gunicorn

1、首先需要安装gunicorn:pip3 install gunicorn

2、在你的工程下新建一个gunicorn的配置文件目录,如server_confs目录,在server_confs下新建一个gunicorn的配置文件,如叫gunicorn.conf。

3、在创建的配置文件中加入以下配置

Nginx+gunicorn项目部署Nginx+gunicorn项目部署
cmmand = '/home/wusir/.local/bin/gunicorn'  #gunicorn命令的绝对路径
pythonpath = '/home/wusir/hz_python/django_test/axf_1806'   #项目路径
bind = '127.0.0.1:12345'   #运行服务的IP和端口
workers = 3   #开几个线程来执行请求
gunicorn配置文件

4、在包含manage.py的同级目录下执行下面命令来运行项目。

gunicorn 工程名.wsgi -c gunicorn配置文件夹/配置文件

 

三、配置supervisor

1、首先需要安装supervisor,命令为:安装:sudo apt install supervisor。

2、在/etc/supervisor/conf.d 目录下新建你的配置文件,如叫axf.conf。

3、在配置文件中加入以下配置:

Nginx+gunicorn项目部署Nginx+gunicorn项目部署
[program:axf_1806]
directory=/home/wusir/hz_python/django_test/axf_1806     #项目路径
command=/home/wusir/.local/bin/gunicorn axf_1806.wsgi -c server_confs/axf_gunicorn.conf    #需要执行的命令
autostart=true         #在supervisord启动的时候也自动启动
startsecs=10           #启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true       #程序退出自动重启,默认unexpected,表示进程意外杀死才重启
startretries=3        #启动失败自动重试次数,默认是3
user=wusir           #哪个用户启动进程,默认是root
priority=999          #进程启动优先级,默认999,值小的优先启动
redirect_stderr=true       #把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=100MB     #stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20     #stdout 日志文件备份数,默认是10
stdout_logfile=/var/log/supervisor_logs/axf.log     #日志文件路径,当指定目录不存在        
                                                                #时无法正常启动,所以需要手动创建目录
stopasgroup=false   #默认false,进程被杀死时,是否向该进程组发stop信号,包括子进程
killasgroup=false   #默认false,进程被杀死时,是否向该进程组发送kill信号,包括子进程
    
supervisor配置文件

PS:1、当我们修改了原码的时候就要重启我们的supervisor。

   2、supervisor 不支持python3 也就是默认python对应版本是python2。

   3、如果启动问题 先去看看log有没有问题,log的位置 stdout_logfile=/var/log/supervisor_logs/axf.log

   4、最好不要在配置文件里面加汉语注释。

   5、如果在程序配置中加入了环境变量,如

Nginx+gunicorn项目部署

需要在配置文件中加入下面这行

Nginx+gunicorn项目部署

gunicorn的常用命令:

supervisord                     #启动supervisor
supervisorctl reload            #修改完配置文件后重新启动supervisor
supervisorctl status            #查看supervisor监管的进程状态
supervisorctl start 进程名       #启动XXX进程
supervisorctl stop 进程名        #停止XXX进程
supervisorctl stop all          #停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl update            #根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

 

PS:做负载均衡的配置

在Nginx的配置文件中加入upstream的以下配置:

Nginx+gunicorn项目部署Nginx+gunicorn项目部署
upstream axf_1806{
    server 127.0.0.1:12345;
}
server{
    listen 80;
    server_name 47.94.225.12;

    location / {
      proxy_pass http://axf_1806;     #配置好了以后IP可以换成上面取的项目名称
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
    location /static {
    alias  /home/wusir/hz_python/django_test/axf_1806/static;
    }
}
负载均衡配置

补充:可以配置多个机器,即可以配置多个server,后面还可以加上每台机器配置的权重,达到负载均衡的效果。

例:server 127.0.0.1:12355 weight=3