Linux下安装部署 Nginx + uWSGI + Django

引自: https://cloud.tencent.com/developer/article/1372693

上一篇文章,我们提到了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:

扫描二维码关注公众号,回复: 7847150 查看本文章
# 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

可以通过以下命令杀死进程:

killall  -9 uwsgi

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 = ['*']

重启服务,如果正常显示,说明没有问题,如果无法访问,再回头仔细检查一下配置。

调优

既然,我们使用了 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/; } }

好了,这就是最终版,动静分离。

访问地址:http://news.52itstyle.com/admin/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

猜你喜欢

转载自www.cnblogs.com/whale-hunter/p/11854082.html