Ubuntu下Django部署nginx+uwsgi

Posted printfnothing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu下Django部署nginx+uwsgi相关的知识,希望对你有一定的参考价值。

不知道大家有没有这种感受:在安装软件和配置环境的时候希望有份详细的文档教你一步步地安装和配置,并且在安装的过程中一次性成功完成,没有任何错误。

但是很多时候文档十分详细,安装过程就会出现很多问题,一样的过程,不同的环境可能就会出错。今天,我捣鼓了下在阿里云服务器和本地虚拟机环境下帮Django配置nginx+uwsgi,期间碰到过的问题现已解决(stackoverflow大法好),下面我说下配置过程,过程中碰到的问题,我会详细的指出,希望能给像我一样初次接触Django+nginx+uwsgi的新手提供点帮助。

在云服务器和本地虚拟机上的操作环境都是Ubuntu,我的Django1.8.11安装过程基本没什么问题,也是参照网上大神们的安装教程的,这里就不说了,主要说下nginx和uwsgi。

1.安装和配置nginx

(1)安装:sudo apt-get install nginx

(2)启动nginx:sudo /etc/init.d/nginx start

    关闭nginx:sudo /etc/init.d/nginx stop

    重启nginx:sudo /etc/init.d/nginx restart

成功启动后的nginx,默认监听80端口,因此在你的浏览器中输入nginx所在环境IP:80应该会看到

这一步注意事项:若你没有使用sudo并且不是在root下启动nginx,也就是单纯的/etc/init.d/nginx start,系统可能不会提示权限不够,会让你误以为nginx已经开启,我在这里就犯过错,而且是在后面配置uwsgi时候才发现的,当时还以为是uwsgi的配置出错了呢。

2.安装和配置uwsgi

uwsgi容易出错的地方比较多。

(1)安装uwsgi:sudo apt-get install uwsgi  成功后使用uwsgi --help看能否出现帮助信息

(2)配置uwsgi:uwsgi是个网关,连接你的nginx服务器和Django服务器,所以要分别配置两次。

首先在nginx上配置uwsgi

打开nginx的配置文件:这里要说明下,我在网上看教程时候说默认配置文件是/etc/nginx/nginx.conf,nginx.conf是配置文件不假,但是其内容跟nginx的版本有关,老版本的内容好像是(节选部分)

server 
    listen       80;    
    server_name  localhost;

    #charset koi8-r; 

    #access_log  logs/host.access.log  main;

    location / 
        root   html;
        index  index.html index.htm;
    


我用的是新版本1.4.6,部分内容是:

http 
	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

        ...................

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;

跟老版本的不太一样,我没有找到'server'的字段,后来读了下‘http’中代码,发现默认的server配置在/etc/nginx/sites-enabled/default

server 
	listen 80 default_server;
	listen [::]:80 default_server ipv6only=on;

	root /usr/share/nginx/html;
	index index.html index.htm;

	# Make site accessible from http://localhost/
	server_name localhost;

	location / 
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
                include uwsgi_params;
          uwsgi_pass 127.0.0.1:8000;
               # Uncomment to enable naxsi on this location
		# include /etc/nginx/naxsi.rules
	


nginx配置文件中的'server'字段与后面配置uwsgi息息相关,所以无论新老版本都必须找到它,然后在其中加入上面所示的两句话,include uwsgi_params;uwsgi_pass 127.0.0.1:8000;ip和port是你Django服务器的ip和port。这样就完成了nginx到uwsgi的配置。

再看Django配置uwsgi:

假设你的Django 工程在文件夹  /abc/djpy下,工程名叫做test。

这样在新建项目的时候在/abc/djpy/test/test下会自动生成wsgi.py;

你需要在/abc/djpy/test/下新建个myuwsgi.ini(uwsgi的初始配置文件),内容可以这么写:

[uwsgi]

# Django-related settings

socket = 127.0.0.1:8000

# the base directory (full path)
chdir           = /abc/djpy/test

# Django s wsgi file
module          = test.wsgi

plugins=python
# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

socket字段是你的django服务器的ip和port,chdir字段是你工程的绝对路径,module就是自动生成的wsgi,master是否开启主进程,processes是子进程数量,plugins是插件,一般django都是写python或者python3,vacuum是否在退出时清楚环境变量。

然后保存文件,执行sudo uwsgi --ini myuwsgi.ini

然后在浏览器中输入nginx服务器ip和端口号,出现下图表示成功:


如果你在执行sudo uwsgi --ini myuwsgi.ini的过程中出现WARNING,很可能导致配置失败,我遇到过的WARNING有:

原因:uwsgi缺少http请求处理插件,解决办法:sudo apt-get install uwsgi-plugin-python

如果你没遇到WARNING,却在连接服务器的时候出现'invalid request block size:'的错误

原因可能是将myuwsgi.ini中的socket字段写成了'socket= :8000'(网上有些教程是这么写的)解决方法:将配置文件中的socket字段的ip和port写完整,如果还不行将socket字段改为http字段,即'http=ip:port'


至此,配置完成,希望能够帮到大家。

以上是关于Ubuntu下Django部署nginx+uwsgi的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu下Django部署nginx+uwsgi

Ubuntu下Django部署nginx+uwsgi

django+uwsgi+nginx部署在ubuntu系统上

通过Nginx部署Django(基于ubuntu)

Ubuntu 下面部署Django 项目

[部署开发环境]部署django的生成环境nginx+uwsgi+django