Linux下安装部署 Nginx + uWSGI + Django


前言

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

   }

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

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

爪哇笔记

作者: 小柒

出处: https://blog.52itstyle.vip

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(345849402@qq.com)咨询。