阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ubuntu 16.10 下部署Django+uWSGI+Nginx服务器

143次阅读
没有评论

共计 5350 个字符,预计需要花费 14 分钟才能阅读完成。

先说说他们的关系,Nginx 和 uWSGI 都是 Web 服务器,Nginx 负责静态内容,uWSGI 负责 Python 这样的动态内容,二者配合共同提供 Web 服务以实现提高效率和负载均衡等目的。uWSGI 实现了多个协议,如 WSGI,HTTP 协议,还有它自己的 uwsgi 协议,想了解更多关于 uWSGI 和 uwsgi 协议内容可以查阅这里。这样和 fastcgi 类似,请求和响应的流程如下:

Request > Nginx > uWSGI > Django > uWSGI > Nginx > Response

请求先交由 Nginx,如果是静态内容就自己处理了,如果是动态内容就交给 uWSGI 服务器,uWSGI 服务器处理整个 Django 项目的 Python 代码,响应请求,原路返回,但是与 fastcgi 不同,Nginx、uWSGI 和 Django 可以独立部署,然后整合。那么我们从 Django 开始,这里的服务器环境是 Ubuntu 16.10。

1. 部署 Django 的项目

安装 Python 和 Django,Ubuntu 自带 2.7 和 3.5 版本的 Python,安装相应的 Django 版本,注意在 Ubuntu 中不同版本 Python 都有相应的命令

www@cloud-vm-ub01:~$ python —version
Python
2.7.12+
www@cloud
-vm-ub01:~$ python3 —version
Python
3.5.2+
www@cloud
-vm-ub01:~$ pip –V
pip
9.0.1 from /home/wisesoe/.local/lib/python2.7/site-packages (python 2.7)
www@cloud
-vm-ub01:~$ pip3 –V
pip
9.0.1 from /home/wisesoe/.local/lib/python3.5/site-packages (python 3.5)

pip3install django

将已经完成开发的 Django 项目 pro(pro 是 Django 项目名)拷贝到服务器,这里拷贝到了 www 用户(www 是服务器可登录用户名)路径下,最后相对路径是~/work/project/pro,绝对路径是 /home/www/project/pro

进入以上目录,使用 Django 的内置服务器测试看看 pro 项目是否运行正常。

python3 ./manage.py runserver 127.0.0.1:8080

2. 部署 uWSGI 服务器

通过 pip 安装 uWSGI。

pip3 install uwsgi

测试 uWSGI 是否正常,在~/work/project/pro 目录中创建一个测试用的 Python 文件 uwsgi_test.py

def application(env, start_response):
        start_response('200 OK',[('Content-Type', 'text/html')])
        #return ['Hello world'] # Python2
        return [b'Hello world'] # Python3

在 pro 项目路径下,基于 HTTP 协议运行 uWSGI,如果 uWSGI 安装正常的话,可以在浏览器中访问 9090 端口,看到 Hello world 字样

uwsgi --http 127.0.0.1:9090 --wsgi-file uwsgi_test.py

接下来启动 uWSGI 加载 Django 项目,这里依然使用 HTTP 协议,将指向具体 Python 文件 –wsgi-file 参数替换为指向 Django 项目的 –module 参数,参数的值 pro.wsgi 指向~/work/project/pro/pro/wsgi.py 模块,如果正常可以在浏览器 http://127.0.0.1:9090 端口打开了项目,但是静态文件路径有问题,不过没关系后面再处理。

www@cloud-vm-ub01:~/work/project/pro$ uwsgi --http 127.0.0.1:9090 --module pro.wsgi

对于 uWSGI 服务器的配置,如上命令加上很多参数非常麻烦,可以写成配置文件的方式,在~/work/project/pro 中创建一个配置文件 uwsgi.ini,注释掉参数暂时忽略,Django 1.4 以前的版本需要配置如 env,pythonpath 等参数,这里不再深究了。

其中 http 参数用于以上测试,而与 Nginx 交互需要使用 socket 参数,即使用 TCP 协议,WSGI 和 uwsgi 协议都在 TCP 协议之上。socket 参数也可以配置为网络地址,如 socket=127.0.0.1:7070,但如果 Nginx 和 uWSGI 同在一个服务器上,可以使用 socket 文件的形式。chmod-socket 是为了动态配置 socket 文件的权限,因为 socket 文件会在每次 uWSGI 启动时被重新创建。

[uwsgi]
http
=127.0.0.1:8000
#socket
=/home/www/work/project/pro/nginx_uwsgi.socket
chdir
=/home/www/work/project/pro/
#chmod-socket
=664
master
=true
processes
=4
threads
=2
module
=pro.wsgi
#wsgi-file
=uwsgi_test.py
#stats
=127.0.0.1:9000

通过下面命令同样可以启动 uWSGI 加载 Djiango 项目

uwsgi --ini uwsgi.ini

3. 部署 Nginx 服务器

通过 apt 安装 Nginx

sudo apt install nginx

Nginx 可以通过以下命令控制。正常安装和启动 Nginx 后,通过 http://127.0.0.1:80 可以看到 Nginx 的欢迎页

sudo service nginx start
sudo service nginx stop
sudo service nginx restart

接下来修改配置 Nginx 配置与 uWSGI 服务器交互。Nginx 的主要配置文件在 /etc/nginx/nginx.conf 和 sites-enabled 文件夹里,nginx.conf 是全局设置,sites-enabled 文件夹里的可以针对不同站点进行配置,其中有个默认的 default 配置文件,该文件其实是 sites-available 文件夹里的 default 文件的软链接,sites-avaliable 像个仓库,但只有 sites-enabled 里的才有效。我们可以将 sites-enabled 的 default 删除,再 cp 一份 sites-available 的 default 到 sites-enabled 里重名为 nginx-pro,同时 cp /etc/nginx/uwsgi_params ~/work/project/pro 里以备 nginx-pro 配置文件调用。

#nginx-pro

 
upstream django{server unix:///home/wisesoe/Work/Project/Python/duty/nginx_uwsgi.sock; # file socket
        #server 127.0.0.1:7070; # TCP socket
}


server {listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name 127.0.0.1; # IP or FQDN

        location /static {alias /home/www/work/project/pro/static;
        }

        location / {
                uwsgi_pass django;
                include /home/www/work/project/pro/uwsgi_params;
                #try_files $uri $uri/ =404;
        }
}

uwsgi_params 文件是 Nginx 向 uWSGI 传递的参数,uwsgi_pass 的意思动态内容请求都通过名为 django 的 upstream 传递给 uWSGI,这使用文件 socket 的方式,那么与之前 uwsgi.ini 里的 socket 参数配置一致。

4. Nginx 权限问题

以上全部配置完成了,但是还有一个重要的权限问题,如果启动 uWSGI 和 Nginx(以下需要两个终端窗口,因为 uwsgi 命令会占据一个),会报错

uwsgi --ini uwsgi.ini
sudo service nginx restart

在 /var/log/nginx/error.log 中会看到 Permission denied 字样,是对 home/www/work/project/pro/nginx_uwsgi.socket 文件没有读写权限,即运行 Nginx 工作进程的用户需要 socket 文件的读写权限。

运行 Nginx 的工作进程的用户在 /etc/nginx/nginx.conf 中有配置,是 user 的值 www-data,但查看 /etc/group 发现 www-data 是个用户组

user www-data;
worker_processes auto;
pid
/run/nginx.pid;

events {
        worker_connections768;
        # multi_accept on;
}

我们可以将 www 用户加入该用户组

usermod -G www-data www

也可以将 socket 文件及其上级目录 pro 的用户组改为 www-data,并为该用户组授予读写权限

chown :www-data ~/home/work/project/pro
chown :www-data ~/home/work/project/pro/nginx_uwsgi.socket
chmod g+rw ~/home/work/project/pro/nginx_uwsgi.socket

5.Nginx 和 Django 静态文件处理

Django 项目可以正常打开,但是静态文件引用路径还有问题,在 Django 开发时 Django 自己可以正确处理静态文件的路径,但是部署后 Nginx 去无法找到静态文件路径。

检查 Nginx 配置文件夹 sites-enabled 里的 nginx-pro 文件,确保里面默认的 try_files 要删掉或者注释掉,否则 Nginx 会因此检查静态文件是否存在。

将 Django 的静态文件集中起来,Django 为此有专门的工具

现在 Django 的 Settings 文件中加上 StATIC_ROOT,把静态文件都集中到这个路径下

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

执行命令

python3 ./manage.py collectstatic

这样所有 Django 前后台的静态文件都会集中到项目文件夹 pro 下 static 中,另外 nginx-pro 其中一个配置 location /static 即可让 Nginx 来处理静态内容。

更多参考

Nginx+uWSGI+Supervisor 在 Ubuntu 上部署 Flask 应用   http://www.linuxidc.com/Linux/2016-07/133064.htm

uWSGI+Django+Nginx 的工作原理流程与部署过程 http://www.linuxidc.com/Linux/2017-03/141785.htm

快速部署 Python 应用:Nginx+uWSGI 配置详解   http://www.linuxidc.com/Linux/2016-12/137830.htm

Nginx+uWSGI+Django+Python 应用架构部署   http://www.linuxidc.com/Linux/2015-10/124183.htm

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django  http://www.linuxidc.com/Linux/2015-04/116397.htm

Flask+uWSGI+Nginx+Ubuntu 部署教程 http://www.linuxidc.com/Linux/2016-06/132690.htm

Ubuntu 16.04 下安装部署 Nginx+uWSGI+Django1.9.7  http://www.linuxidc.com/Linux/2016-07/133484.htm

Nginx+uWSGI+Django 在 Ubuntu 下的部署   http://www.linuxidc.com/Linux/2016-07/133490.htm

uWSGI+Nginx+Django 安装和配置   http://www.linuxidc.com/Linux/2017-03/141822.htm

Linux 上利用 Nginx 代理 uWSGI 处理 Flask Web 应用   http://www.linuxidc.com/Linux/2016-08/134164.htm

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-05/143661.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5350字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中