Fork me on GitHub

Django+uWSGI+Nginx环境搭建

将本地的Django项目部署到云服务器

1.开发环境

  • 开发语言: Python3
  • 后台框架:Django
  • wsgi服务器:uwsgi
  • web服务器:nginx

2.首先python3和pip3的安装

  • 首先安装相关包
    1
    yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
  • 下载python 地址:
    1
    wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
  • 解压
    1
    tar xf Python-3.6.8.tgz
  • 安装目录为/usr/local/python3(可以自定义安装目录)
    1
    ./configure -prefix=/usr/local/python3/
  • 编译并安装
    1
    make && make install
  • 建立软链
    1
    2
    ln -s /usr/local/python3/bin/python3 /usr/bin/python3
    ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
  • 升级pip3
    1
    pip3 pip3 install --upgrade pip
  • 安装其他软件
    1
    2
    yum install mysql mysql-devel
    yum install sqlite-devel

3.安装django

1
pip3 install django1.11.11

4.安装uWSGI

1
2
3
4
5
pip3 install uwsgi

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn
  • 测试:
1
2
3
4
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3

uwsgi –http :666 –wsgi-file test.py

5.将uwsgi与Django连接:

配置setting.py中的allowed_host设置为:

1
ALLOWED_HOSTS = ['boomju.com']

1
uwsgi --http :666 --chdir /root/djlee/ --wsgi-file djlee/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9192

访问 http://boomju.com:666 成功,出现Django欢迎页面。
参数太多,可以将其写入ini文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# hello_uwsgi.ini file
[uwsgi]
socket = 127.0.0.1:8000
# the base directory (full path)
chdir = /var/www/djlee
# Django s wsgi file
module = djlee.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
# 当文件发生改变时重启
touch-reload = /var/www/djlee/djlee/settings.py

uwsgi –ini uwsgi.ini

6.安装配置Nginx

略 详情请见博文《Nginx搭建hexo博客》中安装Nginx部分

7.将nginx和uwsgi以及Django结合

  • Nginx配置文件
    1
    vim /etc/nginx/conf.d/djsite.conf
    在里面添加:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    server{
    listen 80; # 如果不加的话,会默认为80,这里也可以不改
    server_name boomju.com;
    root /root/djlee/;
    index index.html;
    location /{
    include /etc/nginx/uwsgi_params;
    uwsgi_pass 127.0.0.1:8000; # 需要和ini文件中的端口保持一致,这样才能实现两者的
    通信。
    uwsgi_read_timeout 2;
    }
    }
    重启nginx:
    1
    service nginx restart

8.让Nginx处理Django的静态文件

静态文件指JS、css、图片等文件,在django项目投入生产中时,可以不必在setting中指明静态文件的路径,只需在nginx的站点配置中指明即可

  • 修改setting.py文件
    1
    2
    3
    4
    5
    6
    7
    8
    DEBUG = False

    STATIC_URL = '/static/'

    # 所有静态文件(css/js/图片)都放在该文件夹中,该文件夹与manage.py同级
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
    ]
  • 修改Nginx站点配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    server{
    listen 80; # 如果不加的话,会默认为80,这里也可以不改
    server_name boomju.com;

    location /static {
    autoindex on;
    alias /var/www/djlee/static;
    }

    location / {
    include /etc/nginx/uwsgi_params;
    uwsgi_pass 127.0.0.1:8000; # 需要和ini文件中的端口保持一致,这样才能实现两者的
    通信。
    uwsgi_read_timeout 2;
    }
    }

    网站最好不要部署在root目录下,因权限原因容易出现例如403、404等问题。

    后台启动:
    uwsgi: uwsgi uwsgi.ini -d uwsgi.log(可根据不同配置文件启动不同站点,但是会启动多个进程。)
    结束后台进程:
    可以把所有配置文件放到一个文件夹下使用emperor同时启动所有站点

    1
    uwsgi –emperor /path/to/vassals/

    ps -ef |grep uwsgi 查看进程号
    kill -9 父进程号
    或者:
    pkill -f uwsgi -9

本文结束啦 感谢您阅读
路漫漫其修远兮 吾将上下而求索