前言
上一篇文章,我们提到了Python3+Django2 配置后台管理,在开发环境中这样启动测试是没有任何问题的,我们可以使用 Django 默认的服务器。但是,如果部署到外网就要考虑 Django 运行的性能问题了,默认服务器的处理能力是远远不够的。
项目结构
│ manage.py
├─news
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ │ __init__.py
│ │ │
└─itstyle
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
配置
服务器还是选择Linux,部署前需要做以下操作。
Django
由于之前外网没有安装 Django,需要先安装:
pip install Django
sqlite
为了测试方便,这里我们选择 Django 默认自带的 sqlite 数据库:
yum install sqlite*
安装成功以后需要重新配置并编译安装 Python3:
# 配置编译
./configure
# 编译安装
make && make install
uwsgi
安装服务器 uwsgi,你可以把它想象成Java界的Tomcat
pip3 install uwsgi
切换到 news目录,启动:
uwsgi --http :8000 --file itstyle/wsgi.py
你也可以自定义参数:
# 目录下新建文件夹
mkdir script
在 script 下新增 uwsgi.ini:
# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/www/news/
# 指定项目的application
module=itstyle.wsgi:application
# 指定sock的文件路径
socket=/www/news/script/uwsgi.sock
# 进程个数
workers=5
pidfile=/www/news/script/uwsgi.pid
# 指定IP端口
http=127.0.0.1:8000
# 指定静态文件
static-map=/static=/www/news/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/www/news/script/uwsgi.log
然后使用以下命令启动:
uwsgi --ini uwsgi.ini
执行命令,查看是否启动成功:
[root@AY140216131049Z script]# ps -ef|grep uwsgi
root 3040 1 0 Nov21 ? 00:00:03 uwsgi --ini uwsgi.ini
root 3041 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini
root 3042 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini
root 3043 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini
root 3044 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini
root 3045 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini
root 3046 3040 0 Nov21 ? 00:00:00 uwsgi --ini uwsgi.ini
root 6606 6580 0 18:13 pts/0 00:00:00 grep --color=auto uwsgi
重启:
uwsgi --reload uwsgi.pid
停止:
uwsgi --stop uwsgi.pid
Nginx
最后一步,配置Nginx 转发,具体安装这里不再说明,直接上配置:
server {
listen 80;
server_name news.52itstyle.com;
charset utf-8;
location / {
#proxy_pass http://127.0.0.1:8000;
include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
uwsgi_pass unix:/www/news/script/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
}
}
重启Nginx,你以为这样就成功了么?显然不是,由于静态没有加载,这里还需要对静态文件进行映射。
修改配置setting.py,在最后面加入以下配置:
STATIC_ROOT = '/www/news/static/'
然后执行命令:
python3 manage.py collectstatic
最后不要忘了修改一下域名限制参数,否则无法通过域名访问:
# 修改为 * 允许所有
ALLOWED_HOSTS = ['*']
Django默认是英文展示,如果觉得不舒服可以替换成中文,修改setting.py配置:
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
重启服务,如果正常显示,说明没有问题,如果无法访问,再回头仔细检查一下配置。
调优
既然,我们使用了 Nginx 做代理,最好做动静分离,Nginx处理静态资源的能力可以大大高于uWSGI 的。
server {
listen 80;
server_name news.52itstyle.com;
charset utf-8;
location / {
include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
uwsgi_pass unix:/www/news/script/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
}
# 动静分离 Nginx 处理静态请求
location /static {
root /www/news/;
}
}
好了,这就是最终版,动静分离。