Nginx+Gunicorn+Supervisor 搭建 Django 项目环境

参考开发环境在自己的云服务器上搭了一次,中间遇到了一些坑,简要记录下作为备忘。

环境搭建主要是下面四步

  • 虚拟环境的创建
  • Django 项目的创建
  • gunicorn 应用服务器的运行与 Nginx 反向代理
  • supervisor 控制 gunicorn 服务器

关于 Linux 上Python 的安装在 这篇博客 中简要介绍了,挺方便的问题应该不大。

一. 搭建虚拟环境

首先就是 Python 虚拟环境的创建了,在实际项目开发中,我们可能有的项目需要用 Python2,有的需要用 Python3,以及会用到各种的库,如果只有一个环境势必会造成冲突。Python 可以创建虚拟环境很好的解决了这个问题。通过创建一个个互相独立的虚拟环境,来保证各个项目独立拥有管理各自的开发环境。

我们通过 virtualenv 来创建虚拟环境,同时为了提高易用性在 virtualenv 的基础上还提供了 virtualenvwrapper 。下面是两者的简要安装。

1. 安装 virtualenv
pip install virtualenv
2. 安装 virtualenvwrapper
pip install virtualenvwrapper
3. 配置命令

virtualenvwrapper 安装完成后首先需要配置一个集中管理虚拟环境的目录,默认是 ~/.virtualenvs 。我们可以执行如下命令自行配置管理目录和使 virtualenvwrapper 相关命令生效

# 配置虚拟环境的统一管理目录
export WORKON_HOME=$HOME/py_envs
# 使 virtualenvwrapper 相关的命令生效
source /usr/bin/virtualenvwrapper.sh

接下来就可以使用相关命令管理虚拟环境了,常用命令如下:

  • mkvirtualenv 新建虚拟黄精
  • workon 列出所有虚拟环境
  • workon env_name 进入某个虚拟黄精
  • deactivate 退出虚拟环境
  • rmvirtualenv 删除虚拟环境

更详细的用法参考其文档

4. 创建虚拟环境

创建命令如下,-p 参数用来指定 Python 的版本,这里我们没用系统自带的 2.7,而是指定了自己安装的 Python3.6 来创建虚拟环境

mkvirtualenv -p /usr/local/python3.6/bin/python3.6 env_3.6

创建完成后就默认进入了虚拟环境,可以通过 deactivate 来退出。在我们指定的 ~/py_envs 中就会出现所创建的虚拟环境,也可以通过 workon 命令查看或者切换。

# 创建虚拟环境
[root@ bin]# mkvirtualenv -p /usr/local/python3.6/bin/python3.6 env_3.6
Running virtualenv with interpreter /usr/local/python3.6/bin/python3.6
Using base prefix '/usr/local/python3.6'
New python executable in /root/py_envs/env_3.6/bin/python3.6
Also creating executable in /root/py_envs/env_3.6/bin/python
Please make sure you remove any previous custom paths from your /root/.pydistutils.cfg file.
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /root/py_envs/env_3.6/bin/predeactivate
virtualenvwrapper.user_scripts creating /root/py_envs/env_3.6/bin/postdeactivate
virtualenvwrapper.user_scripts creating /root/py_envs/env_3.6/bin/preactivate
virtualenvwrapper.user_scripts creating /root/py_envs/env_3.6/bin/postactivate
virtualenvwrapper.user_scripts creating /root/py_envs/env_3.6/bin/get_env_details
# 列出虚拟环境列表
(env_3.6) [root@ bin]# workon
env_3.6
# 进入虚拟环境管理目录
(env_3.6) [root@ bin]# cd ~/py_envs/
(env_3.6) [root@ py_envs]# ll
total 4
drwxr-xr-x 5 root root 4096 Jan  6 21:43 env_3.6
# 退出虚拟环境
(env_3.6) [root@ py_envs]# deactivate
[root@ py_envs]#

另外在创建虚拟环境是可能会遇到如下错误:

python3.6: error while loading shared libraries: libpython6.5m.so.1.0: cannot open shared object file: No such file or directory

其原因是找不到 Python 的共享链接库。解决方法是在找到共享库文件 /etc/ld.so.conf ,这个文件记录了编译时使用的动态链接库的路径,一般默认配置了 /lib 和 /usr/lib ,这里我们需要将安装的 Python3.6 的共享库路径添加进去:

/usr/local/python3.6/lib

然后执行 ldconfig 命令就可以了生效了。

二. 创建 Django 项目

虚拟环境建好了,之后就是安装 Django 创建 Django 项目了。首先进入们的虚拟环境,然后通过 pip 进行安装。之后在通过相关命令或者 IDE 操作创建 Django 项目即可。

[root@ py_envs]# workon env_3.6
(env_3.6) [root@ py_envs]# pip3.6 install django
(env_3.6) [root@iz2ze9cwe60vsxlng3l8emz ~]# django-admin startproject Demo

关于 Django 项目的配置与开发这里不作赘述,具体参阅 官方文档

三. Gunicorn 部署 Django 项目

Gunicorn 是一个被广泛使用的 Python WSGI UNIX HTTP服务器,可以兼容 Django 、Flask 等框架。

先来安装 Gunicorn, 其支持使用 pip 安装 进行安装

pip install gunicorn

安装完成后就可以通过 gunicorn 命令来启动我们的 Django 应用了。

(env_3.6) [root@ Demo]# gunicorn --env DJANGO_SETTINGS_MODULE=Demo.settings -b:8100 Demo.wsgi

[2018-01-07 10:41:35 +0800] [1601] [INFO] Starting gunicorn 19.7.1
[2018-01-07 10:41:35 +0800] [1601] [INFO] Listening at: http://0.0.0.0:8100 (1601)
[2018-01-07 10:41:35 +0800] [1601] [INFO] Using worker: sync
[2018-01-07 10:41:35 +0800] [1604] [INFO] Booting worker with pid: 1604
Invalid HTTP_HOST header: '0.0.0.0:8100'. You may need to add '0.0.0.0' to ALLOWED_HOSTS.
AInvalid HTTP_HOST header: '0.0.0.0:8100'. You may need to add '0.0.0.0' to ALLOWED_HOSTS.

上面指定了端口为 8100 以及项目的 setting 和 wsgi 文件。下面就可以访问了。通过命令行执行后就可以看到 Django 默认的首页文件内容了。

curl http://0.0.0.0:8100

四. Nginx 反向代理

我们的项目最终是要给客户端访问的,最常用的方式就是通过 Nginx 反向代理的方式来提供访问。
关于 Nginx 的安装这里不做赘述.

下面是一个简单的配置示例:


http {
    include       mime.types;
    default_type  application/octet-stream;

    #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;

    sendfile        on;

    keepalive_timeout  65;

    server {
        # 监听端口
        listen 8002;
        server_name localhost;
        server_name 127.0.0.1;
        # 公网 IP
        server_name 111.111.111.111;

        location / {
            proxy_set_header Host $host;
            # 反向代理的应用服务器
            proxy_pass http://unix:/home/dev/projects/Demo/data/guni.sock;
        }
    }

}
  • proxy_pass: 这是反向代理中最关键的配置项了,通过该配置项将当前请求反向代理到 URL 参数指定的服务器上。配置的 URL
    可以是主机名、IP+端口或者 UNIX 句柄的形式。我们的配置就是使用了 UNIX 句柄
  • proxy_set_header: 反向代理默认情况下不会转发 HOST 头部信息,如果要转发必须添加该配置项。

五. supervisor 管理服务器进程

我们的 gunicorn 服务器都是以后台进程运行的,我们可以使用 supervisor 来进行监控和管理,这是一个用 Python 开发的进程管理工具,目前只支持 Python2.7。

1. 安装

我使用的是 centos 系统,可以直接使用 yum 进行安装,也可以通过 apt-get 或者 pip 安装

yum install supervisor

一般系统上都会预装了 Python2.7 的环境,我们可以直接运行 supervisor 。

安装完成后,在 /etc 目录下会生成 supervisord.conf 配置文件和 supervisord.d 文件夹。个人习惯会新建 /etc/supervisor/ 目录,将 配置文件放置在该目录,并在该目录下创建 conf.d 目录用来统一管理各个进行管理配置文件。

2. 修改配置文件

接下来是修改 supervisor 的配置文件,指明进程管理文件的目录

[unix_http_server]
file=/var/run/supervisor/supervisor.sock   ; (the path to the socket file)
# ; 开头表示的是注释,修改权限
chmod=0760                ; sockef file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; (default is no username (open server))
;password=123               ; (default is no password (open server))

[include]
files = supervisord.d/*.ini
# 指定配置文件目录,个人习惯置于 /etc/supervisor/conf.d 目录下
files = /etc/supervisor/conf.d/*.conf
3. 创建 Django 项目管理文件

接下来就是在 conf.d 文件夹下创建管理文件了,我的管理文件如下

# 项目名称
[program:demo]
# 项目路径
directory=/home/dev/projects/Demo
# 执行命令用户
user=root
# 进程执行的命令 这里我们使用 gunicorn 命令,并指定了项目的句柄
# 反向代理中的 proxy_pass 也要配置成对应的句柄
command=/home/py_envs/env_3.6/bin/gunicorn Demo.wsgi -b unix:/home/dev/projects/Demo/data/guni.sock --workers=1 --max-requests=1000 --log-level=debug --log-file=/home/dev/projects/Demo/data/logs/guni.log

redirect_stderr=true
stderr_logfile=none
stdout_logfile=/var/log/supervisor/demo.log
autostart=true
autorestart=true
4. 使用 supervisor 控制 Django 项目

配置完成后,首先 启动 supervisord,然后就可以通过 supervisorctl 命令来控制了。命令如下

# 启动 supervisord
[root@ ~]#sudo  supervisord
Unlinking stale socket /var/run/supervisor/supervisor.sock
# 使用 supervisorctl 重启 gunicorn
[root@ ~]# sudo supervisorctl restart demo
demo: stopped
demo: started
[root@iz2ze9cwe60vsxlng3l8emz ~]#

这样就可以方便的管理我们的 Djnago 项目了,下面是实际工作开发中用到的部署项目命令,一键部署重启。

git pull --rebase && ./manage.py collectstatic -c --noinput && sudo supervisorctl restart demo

OK ,上面就是整个过程,虽然遇到了坑但总体还算顺利,希望对需要的同学有所帮助。

你可能感兴趣的:(Django,django)