Linux下安装部署 Nginx + uWSGI + Django

Posted whale-hunter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:

# 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/

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

以上是关于Linux下安装部署 Nginx + uWSGI + Django的主要内容,如果未能解决你的问题,请参考以下文章

CentOs Linux 对于Django uwsgi + Nginx 的安装与部署

Linux 下部署Django项目

Nginx+uWSGI+Django+Python在Linux上的部署

uwsgi+nginx反向代理项目部署

部署flask应用到nginx+uwsgi+linux服务器

一个简单的python web应用部署 nginx + uwsgi