68. Django项目部署nginx + gunicorn

2022-01-17 13:59:03 浏览数 (1)

需求

在使用 uwsgi配置dwebsocket的时候,总会有使用上的问题。

image-20200420111715653

但是,直接使用python manage.py runserver启动是没问题的。其实只是我没有将uwsgi配置好,不过本章节主要是想看看如何使用gunicorn来部署试试。

安装gunicorn

安装命令如下:

代码语言:javascript复制
pip3 install gunicorn

配置全局命令:安装完毕之后,全局环境是无法直接执行的,需要找到二进制文件软链接到/usr/bin路径下。

代码语言:javascript复制
# 安装之后,无法直接执行命令
[root@server01 ~]# gunicorn -h
-bash: gunicorn: command not found

搜索安装之后,gunicorn二进制可执行文件的位置:

代码语言:javascript复制
[root@server01 ~]# find / -name "*gunicorn*" -ls | grep python3 | grep bin
405121    4 -rwxr-xr-x   1 root     root          236 Dec 12 08:31 /usr/local/python3/bin/gunicorn
[root@server01 ~]# 

设置软链接如下:

代码语言:javascript复制
[root@server01 ~]# ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn
[root@server01 ~]# 
[root@server01 ~]# ls -ll /usr/bin/gunicorn
lrwxrwxrwx 1 root root 31 Dec 12 08:38 /usr/bin/gunicorn -> /usr/local/python3/bin/gunicorn
[root@server01 ~]# 

配置软链接之后,就可以全局环境使用gunicorn了,例如查看版本如下:

代码语言:javascript复制
[root@server01 ~]# gunicorn -v
gunicorn (version 20.0.4)
[root@server01 ~]# 

使用gunicorn启动Django项目

在项目根目录新建配置文件 gunicorn.confg

代码语言:javascript复制
bind = "0.0.0.0:8000"

# workers是工作线程数,一般设置成:服务器CPU个数   1
workers = 2

#./代表当前目录
errorlog = './logs/gunicorn.error.log'
accesslog = './logs/gunicorn.access.log'

项目启动

普通命令行启动
代码语言:javascript复制
gunicorn -w 4 -b 0.0.0.0:8000 --access-logfile access.log --error-logfile error.log 项目名.wsgi
使用配置文件启动
代码语言:javascript复制
gunicorn 项目名.wsgi -c gunicorn.confg -D

配置文件gunicorn.confg

代码语言:javascript复制
bind = "0.0.0.0:8000"

# workers是工作线程数,一般设置成:服务器CPU个数   1
workers = 2

#./代表当前目录
errorlog = './logs/gunicorn.error.log'
accesslog = './logs/gunicorn.access.log'

执行如下:

代码语言:javascript复制
gunicorn performance.wsgi -c gunicorn.confg -D
重启gunicorn

当代码出现部署变更,那么则需要重启一下 gunicorn

代码语言:javascript复制
# 查看当前的gunicorn进程
[root@locust01 performance]# ps -ef | grep gunicorn
root       848 30090  0 17:13 pts/2    00:00:00 grep --color=auto gunicorn
root      2973 27177  0 May12 ?        00:00:17 /usr/local/python3/bin/python3.7 /usr/bin/gunicorn performance.wsgi -c gunicorn.confg -D
root      4940 27177  0 May12 ?        00:00:14 /usr/local/python3/bin/python3.7 /usr/bin/gunicorn performance.wsgi -c gunicorn.confg -D
root     27177     1  0 May07 ?        00:01:33 /usr/local/python3/bin/python3.7 /usr/bin/gunicorn performance.wsgi -c gunicorn.confg -D
[root@locust01 performance]# 
[root@locust01 performance]# ps -ef | grep gunicorn | grep -v color | awk '{print $2}'
2973
4940
27177

# kill 当前gunicorn 进程
[root@locust01 performance]# ps -ef | grep gunicorn | grep -v color | awk '{print $2}' | xargs kill -9
[root@locust01 performance]# 
[root@locust01 performance]# ps -ef | grep gunicorn
root       903 30090  0 17:13 pts/2    00:00:00 grep --color=auto gunicorn

# 重启服务
[root@locust01 performance]# gunicorn performance.wsgi -c gunicorn.confg -D
!!!
!!! WARNING: configuration file should have a valid Python extension.
!!!

[root@locust01 performance]#
[root@locust01 performance]# ps -ef | grep gunicorn
root       989     1  0 17:14 ?        00:00:00 /usr/local/python3/bin/python3.7 /usr/bin/gunicorn performance.wsgi -c gunicorn.confg -D
root       992   989  3 17:14 ?        00:00:00 /usr/local/python3/bin/python3.7 /usr/bin/gunicorn performance.wsgi -c gunicorn.confg -D
root       993   989  3 17:14 ?        00:00:00 /usr/local/python3/bin/python3.7 /usr/bin/gunicorn performance.wsgi -c gunicorn.confg -D
root      1044 30090  0 17:14 pts/2    00:00:00 grep --color=auto gunicorn
[root@locust01 performance]# 

或者使用 --reload参数,自动重启。

也可以直接修改配置文件如下:

代码语言:javascript复制
bind = "0.0.0.0:8000"

# workers是工作线程数,一般设置成:服务器CPU个数   1
workers = 2

#./代表当前目录
errorlog = './logs/error.log'
accesslog = './logs/access.log'

# 设置自动重启
reload = True

使用gunicorn启动默认是无法找到statics文件的

启动服务之后,访问网页,可以看到statics的文件目录是

image-20200420121828554

根据解决问题的办法,使用nginx转发static即可。

Nginx配置访问gunicorn

安装nginx这个步骤就省略了,下面来看看如何设置转发。

Nginx配置:

打开/usr/local/nginx/conf/nginx.conf文件

代码语言:javascript复制
...
http {
    ....
    # 配置performance项目的上游服务
    upstream performance{
        server 127.0.0.1:8888;
    }

    # 配置server
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;

        access_log  logs/host.access.log  main;

        # 配置动态请求使用gunicorn
        location / {	
            #请求转发到gunicorn服务器
            proxy_pass http://performance;
            #设置请求头,并将头信息传递给服务器端 
            proxy_set_header Host $host;
            proxy_http_version 1.1;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # 解决nginx转发websocket连接失败的问题
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

        # 配置静态文件路径
        location /static/ {
            alias /work/performance/static/;
        }
        
        ...
    }

}

0 人点赞