在之前的几篇博客中对Django的功能做了初步实践,这里链接贴一下:
Django之--通过MVC架构的html模板展示Hello World!
到这里基本的测试暂时告一段落,但是在实际开发中是不可能用python manage.py runserver这种方式启动web server的,因此接下来测试如何使用uwsgi+nginx的方式启动Django。
一、安装uWSGI和Nginx
pip3.6 install uwsgi
yum -y install nginx
WSGI / uwsgi / uWSGI 这三个概念的区别:(引用自:http://www.cnblogs.com/alex3714/p/6538374.html)
二、为uWSGI编写配置文件
vi /etc/uwsgi.ini
[uwsgi]
chdir=/root/Django/mysite/ --即网站根目录。
module=mysite.wsgi:application --标识app位置。
static-map=/static=/root/Django/mysite/static --表示模板引用的静态文件的目录,使用图片时必须设置。
socket=192.168.1.193:8000 --用于接收nginx请求的socket,可以是文件,而且建议是文件,这里懒的改了。
master = true
vhost = true
no-site = true
workers = 2
reload-mercy = 10
vacuum = true
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi.pid
daemonize = /tmp/uwsgi.log --uWSGI日志,安装uwsgi调试时有用。
三、修改Nginx配置文件
upstream部分一般用于配置负载均衡,这里就不写了。
server { listen 80 default_server; --表示监听80端口,我们最后也通过访问此端口来访问网站的。 listen [::]:80 default_server; server_name 192.168.1.193; #定义server访问名,表示只处理此访问名的请求,如果不设置会默认当前第一个server域,因此不设置也行。 access_log /etc/nginx/access.log main; #nginx日志 root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { #默认请求访问 include /etc/nginx/uwsgi_params; uwsgi_pass 192.168.1.193:8000; #请求自动转发给192.168.1.193:8000的uWSGI socket,与上面uWSGI的socket参数要一致。 index index.html index.htm; client_max_body_size 35m; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
四、运行uWSGI和nginx
启动uwsgi和nginx:
uwsgi --ini=/etc/uwsgi.ini
service nginx start
此时你就可以通过你在urls.py定义的网址来访问页面了。但是需要注意的nginx上边我监听的是80端口,因此你只需要访问80端口就好,他会把请求全部转发到8000端口的uwsgi处理。
显示的页面如下图所示(默认的80端口):
最后:
必须要说的是不使用nginx只用uwsgi也可以实现以上的功能,但是此时你需要为uwsgi.ini配置http参数,socket参数可以省略,如果只使用uwsgi那么你可以通过http参数定义的端口访问以上页面。使用nginx的最大好处之一是实现对后端uwsgi的负载均衡,这样可以提升并发量,此外nginx对静态请求的处理能力要强过uwsgi,因此如果静态请求较多,那么可以将这部分内容用nginx处理。
补充:
最近在用uwsgi+nginx设置https访问项目时遇到了uwsgi无法启动的问题,网上大多数回答都是要么没装django(我特么智障不装django来问问题??!!)要么用了virtualenv(确实没用这玩意儿),到最后还是在十多个stackoverflow的相似话题里找到了一个合胃口的,具体网页原谅我忘记了隐约记得是非前排的、32个赞的回答。
uwsgi日志报错如下:
*** Operational MODE: preforking *** Traceback (most recent call last): File "./mysite/wsgi.py", line 13, in <module> from django.core.wsgi import get_wsgi_application ModuleNotFoundError: No module named 'django' unable to load app 0 (mountpoint='') (callable not found or import error)
我开始以为是系统默认python命令是python2的缘故,但是改为3也是不行,后来看到那位大佬的回复后隐约找到了这个问题应该是django和uwsgi的版本更新速度不协调的问题,这个不是我自己能解决的,暂时的解决办法就是在项目的主app下的wsgi.py文件里加上如下的语句(事实上你单独import sys,然后看sys.path是包含这个路径的,只是uwsgi不知道):
import sys sys.path.append('/usr/local/lib/python3.6/site-packages')