关于部署 Django 项目的笔记。
注:这篇文章是从旧的博客系统中迁移过来的、我觉得还存在价值的文章。但是由于时间关系,可能已经不再是最佳实践,请仅作参考。
服务器的部署笔记。
各部分功能介绍:
- Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。
- uWSGI 负责多线程,即支持多人同时访问网站。
- Django 是由 Python 编写的开源 Web 应用框架,适合个人小项目搭建。
服务器系统为 CentOS7,当然记录的所有命令再更高版本上也都可以使用。
1、升级至 Python3
既然搭建的是 Python 项目,首先升级以下服务器端的 Python 版本,默认 Linux 自带 Python2,我们把它先升级为 Python3。
安装依赖软件
yum -y install sqlite-devel
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
下载安装 Python3.6
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
tar zxvf Python-3.6.1.tgz
cd Python-3.6.1
./configure --prefix=/usr/local/python3
make && make install
创建 Python 及 pip 命令软链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
这样 Python3 就已经安装完成了,键入 Python3 再回车就可以进入 Python 编译了。
注:Ctrl+Z 退出 Python 编译

2、安装 Django
接下来安装 Django 并配置项目,这里选择的版本是 2.1.8,单纯的因为够用且稳定,新版本的环境配置没有前人指导。
pip3 install django==2.1.8
等待安装完成后,上传 Django 项目到服务器上任意目录,使用 Xftp 或者 git clone 都可以
cd 项目文件夹
python3 manage.py runserver 0.0.0.0:80
注意,运行项目时可能报错:
You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run ‘python manage.py migrate’ to apply them.
这时只需要按照提示,输入以下内容即可
python3 manage.py migrate
出现以下信息则说明启动成功。

注意: 如果访问页面出现了以下错误,那么进入你的项目,修改 settings.py 将 ALLOWED——HOSTS = [] 修改为 [’*’] 即可解决。
DisallowedHost at / Invalid HTTP_HOST header: ‘47.56.227.27’. You may need to add ‘47.56.227.27’ to ALLOWED_HOSTS.

至此,Python 环境与 Django 环境就安装完成。
3、安装 uWSGI Web 网关
首先下载安装 uWSGI
wget http://projects.unbit.it/downloads/uwsgi-2.0.1.tar.gz
tar zxvf uwsgi-2.0.1.tar.gz
cd uwsgi-2.0.1
python3 uwsgiconfig.py --build
cp -R /home/uwsgi-2.0.1 /usr/local/uwsgi
ln -s /usr/local/uwsgi/uwsgi /usr/bin/uwsgi
然后测试 uWSGI 是否安装成功,创建测试文件
vi test.py
文件内容为:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
输入完成后 :wq 保存,然后执行以下命令进行测试。
/usr/local/uwsgi/uwsgi --http :9090 --wsgi-file /home/test.py
防火墙开放端口指令:
# 查看当前开放的所有端口 firewall-cmd --list-all # 替换为你需要开放的端口 firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload
然后去对应服务商的安全组处开放安全组。这里就以阿里云国际为例。

前往你的 IP:9090 出现 Hello World 就说明 uWSGI 的安装已经完成了!

4、uWSGI 和 Django 结合
uwsgi --http :9090 --chdir /home/Django 项目文件夹 --wsgi-file Django 项目(与 manage.py 同级)/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9192
同样访问 IP:9090 ,如果可以访问 Django 页面则说明成功。
注:如果在访问 Django 项目时静态文件加载失败可以先忽略,在 Nginx 配置中会指定静态文件路径,配置后可以正常访问。
5、安装 Nginx
首先下载安装依赖第三方软件 PCRE
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.34/pcre-8.34.tar.bz2
tar jxvf pcre-8.34.tar.bz2
如果报错:bzip2: Cannot exec: No such file or directory
执行:yum -y install bzip2
cd pcre-8.34
./configure --enable-utf8
make && make install
下载安装依赖第三方软件 OpenSSL
wget http://distfiles.macports.org/openssl/openssl-1.0.2h.tar.gz
tar zxvf openssl-1.0.2h.tar.gz
下载安装 Nginx
wget http://nginx.org/download/nginx-1.9.9.tar.gz
tar zxvf nginx-1.9.9.tar.gz
./configure --prefix=/usr/local/nginx --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-openssl=/home/openssl-1.0.2h --with-http_gzip_static_module --with-http_sub_module --with-cc=/usr/bin/gcc
make install
新建 www 用户
useradd -s /sbin/nologin -M www
备份、修改 Nginx 配置文件
cd /usr/local/nginx/conf
cp -f nginx.conf nginx.conf_bak
vi nginx.conf
(修改文件)
user www; # 修改启动用户为 www
worker_processes 4; # 启动4个进程,根据实际需求配置
启动 Nginx
cd /usr/local/nginx/sbin
./nginx
如果报错:nginx: [emerg] still could not bind()
说明80端口目前被占用
执行:netstat -apn | grep 80然后:
kill -9 2610526105 为搜索出来的 0.0.0.0/80 对应的 PID
注意:需要删除 5-6 次,因为执行的适合有进程保护
再访问 IP:80 显示 Nginx 页面说明 Nginx 安装成功。

6、Nginx + uWSGI + Django 三者连携
首先在 Django 项目文件夹中创建 uwsgi.ini
vi uwsgi.ini
(文件内容)
[uwsgi]
# uwsgi启动端口
socket = 127.0.0.1:9090
# django项目目录
chdir=/home/SteamCash
module=SteamCash.wsgi
master = true
processes=2
threads=2
max-requests=2000
chmod-socket=664
vacuum=true
# 日志路径
daemonize = /home/SteamCash/logs/uwsgi.log
配置 Nginx
vi /usr/local/nginx/conf/nginx.conf
(文件内容)
......
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 选择为你项目的static文件夹
location /static {
alias /home/SteamCash/static;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
root html;
index index.html index.htm;
}
......
启动 uWSGI
uwsgi --ini /home/SteamCash/uwsgi.ini
启动 Nginx
./usr/local/nginx/sbin/nginx
接着访问页面即可。
