Nginx服务器部署Django应用
之前做了一个关于Apache服务器上的部署Django的应用,最近发现Nginx是个很方便的服务器软件,于是就花了点时间来部署这个
[Setting up Django and your web server with uWSGI and nginx]这个链接是官方发布的文档,参考这个文档基本是稳稳地把这个Django应用部署上去。
注意!
官方的文档确实很详细了,但是这里要明白通过浏览器最终访问到网站的数据的流程:client <--> nginx <-->socket<--> wsgi <--> Django app
文档部署案例中因为相连接环节多,是选择了其中几个环节连通,最后将整个连接打通。
部署环境
- ubuntu 16.04.3
- django 2.0
- nginx 1.10.3
Django App
安装Django
安装虚拟环境工具包:pip install virtualenv
创建虚拟环境env35virtualenv --no-site-packages --python=3.5 env35
virtualenv创建一个独立的Python运行环境,加上参数–no-site-packages,使得已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,就得到了一个不带任何第三方包的“干净”的Python运行环境。
激活虚拟环境source env35/bin/activate
# 激活环境,进入env35虚拟环境
安装Django工具包pip3 install django
# 安装Django
安装mezzanine工具包pip3 install mezzanine
# 这个是开源 CMS Web 框架```
创建项目:mezzanine-project blogsite
创建数据库:python manage.py createdb
收集静态文件:python manage.py collectstatic
uwsgi协议模块
安装uwsgi模块:pip install uwsgi
运行Django应用:uwsgi --http :8001 --module blogsite.wsgi
#测试 遇到Invalid HTTP_HOST header: ‘192.168.0.100:8001’. You may need to add ‘192.168.0.100’ to ALLOWED_HOSTS.
A:这个需要在blogsite/setting.py 相应参数中添加这个ip地址。
通过浏览器访问到Django App下ip+端口访问成功,说明检查client <-->wsgi <--> Django app
是连通的。这个在官方文档中看到这类似示图。
配置相应的文件
在项目文件下 创建 nginx.conf ,uwsgi.ini , uwsgi_params三个文件
Nginx
安装nginxsudo apt install nginx
在blogsite项目文件下创建nginx.conf服务器配置文件vim nginx.conf
编写内容如下
#mysite_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
server unix:///home/zack/blogsite/blogsite.sock; # for a file socket 即UNIX Socket通信机制
# server 127.0.0.1:8001; # for a web port socket (we'll use this first) 即TCP/IP Soket通信机制
}
# configuration of the server
server {
# the port your site will be served on
listen 8002;
# the domain name it will serve for
server_name 192.168.0.100; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
#location /media {
# alias /path/to/your/mysite/media; # your Django project's media files - amend as required
# }
location /static {
alias /home/zack/blogsite/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django; # 找到upstream模块 django
include /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
}
}
这个nginx.conf 需要软链接到 ln -s /home/zack/blogsite/nginx.conf /etc/nginx/sites-enabled/ 使nginx能够使用到这个项目文件下的nginx.conf配置文件。
本次案例中使用的是UNIX Socket通信机制。UNIX Socket是同一台服务器上不同进程间的通信机制;TCP/IP Socket是网络上不同服务器之间进程的通信机制,当然也可以让同一台服务器的不同进程通信。
重新启动nginx服务器service nginx restart
uwsgi.ini
创建uwsgi.ini文件:vim uwsgi.ini
配置内容如下:
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /home/zack/blogsite
# Django's wsgi file
module = blogsite.wsgi
# the virtualenv (full path) 这里的值是虚拟环境env35的路径
home = /home/zack/env35
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = /home/zack/blogsite/blogsite.sock
# ... with appropriate permissions - may be needed
chmod-socket = 664
# clear environment on exit
vacuum = true
这里socket 参数和nginx.conf文件中的
server unix:///home/zack/blogsite/blogsite.sock;相对应匹配这样可以实现nginx<-->socket<-->wsgi
连通。
uwsgi_params
将/etc/nginx/uwsgi_params路径下的这个文件拷贝到项目文件夹下cp /etc/nginx/uwsgi_params
#将uwsgi_params文件拷贝到当前项目文件下。
退出虚拟环境外安装uwsgi
敲入deactivate命令 退出虚拟环境env35pip install uwsgi
设置开机启动uwsgi
在/etc/rc.local 添加/usr/local/bin/uwsgi --ini /home/zack/blogsite/uwsgi.ini
设置开机启动uwsgi.ini
这样可以通过浏览器访问了!
note!
设置开机启动uwsgi,服务器一直卡在启动uwsgi的界面,不能看到登录界面。有时候重新启动Linux会卡死,这个事情让我体会到生产环境中后台运行的服务器不能随便重启,否则会出现意想不到的问题。这也是作为程序员的苦逼之处……