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

接下来修改配置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_connections
768;
        # 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应用 

uWSGI+Django+Nginx的工作原理流程与部署过程

快速部署Python应用:Nginx+uWSGI配置详解 

Nginx+uWSGI+Django+Python 应用架构部署 

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django 

Flask+uWSGI+Nginx+Ubuntu部署教程

Ubuntu 16.04下安装部署 Nginx+uWSGI+Django1.9.7 

Nginx+uWSGI+Django在Ubuntu下的部署 

uWSGI+Nginx+Django安装和配置 

Linux 上利用Nginx代理uWSGI处理Flask Web应用 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/38000480c1200e5eaaf1ddaf46344bb7.html