正确部署后的结构应该是
the outside world <-> nginx <-> the socket <-> uwsgi <-> Django / test.py
下面,将一次介绍各软件的安装和配置(写脚本):
- uwsgi ( 基于 wsgi 协议实现的服务器软件 )
- django(用纯python写网站太麻烦,通过django 的 api , 可以更方便)
- nginx (单用uwsgi也能搭建,但nginx结合 wsgi 协议,可实现安全、快速访问和牛逼功能)
0 django
0-1 安装 (参考django官网)
0-2 新建项目 (参考官网)
1 uwsgi
1-1 安装
sudo pip install uwsgi --upgrade
1-2 运行
通过命令行,运行服务器
#1: uwsgi --http ip:port --module mysite.wsgi
#2: uwsgi --socket /to/your/project/uwsgi.sock --chmod-socket=666 --wsgi-file test.py
#3: uwsgi --socket /to/your/project/uwsgi.sock --chmod-socket=666 --chdir /to/your/project --module mysites.wsgi
通过配置文件,运行服务器
uwsgi --ini uwsgi.ini
1-3 删除被占用端口
ps ax | grep uwsgi
kill all -9 uwsgi
1-4 配置.ini
# django.ini file
[uwsgi]
# master
master = true
# maximum number of processes
processes = 10
# the socket (use the full path to be safe)
# socket 的具体放置位置
# 服务器开启时自动生成
socket = /to/yout/project/uwsgi.sock
# with appropriate permissions - *may* be needed
# 重要!对socket设置666权限,增删改除
# 如果没有设置,有可能网络访问不了,因为没有权限创建
chmod-socket = 666
# the base directory
chdir = /to/yout/project
# Django's wsgi file
# 因为 加了 chdir ,所有直接输入 project文件内的路径
# 注意! project.wsgi 中间是 “.” 而不是 “/”
module = project.wsgi
# the virtualenv
# home = /path/to/virtualenv
# clear environment on exit
vacuum = true
2 nginx
2-1 安装
sudo apt-get install python-dev
sudo apt-get install nginx
2-2 nginx 各种文件的放置位置
#1: /user/local/nginx
#2: /etc/nginx/
#3: /etc/nginx/nginx.conf
#4:/var/log/nginx/ #放置nginx的log信息
nginx 的默认配置文件放置在 /etc/nginx/nginx-availale/ 内,监听端口默认80,所有http访问127.0.0.1:80后,会显示nginx的欢迎界面。
2-3 查看版本
nginx -v
2-4 运行
sudo service nginx start
sudo service nginx restart
sudo service nginx stop
sudo service nginx configtest #检查 nginx 配置文件正确性
2-5 配置 mysite_niginx.conf
假设:django项目( 项目名:project )放置的路径为 /to/your/project/
# mysites_nginx.conf
upstream boxx{ # 名字boxx可以被DIY
# connect to this socket
server unix:///to/your/project/uwsgi.sock; # 通过socket访问
# server 127.0.0.1:8001; # 通过http访问
# -.-! 如果运行在云平台, 此处应使用内网IP地址
}
server {
# 指定浏览器或api要访问的接口端口
# 你可以在浏览器输入 example.com:8000 访问网站
listen 8000;
# the domain name it will serve for
server_name example.com; # 代替为你的IP或域名
# -.-! 如果是运行在云平台,此处应使用内网IP地址
charset utf-8;
#Max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /to/your/project/media; # Django项目的media files路径
}
location /static {
alias /to/your/project/static; # Django项目的static files路径
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass boxx; #名字boxx要和上面对应上
include /etc/nginx/uwsgi_params; #
}
}
#注意#
nginx 和 uwsgi 是怎么联系的呢?更具上面.ini 和 .conf文件,我们可以看到:
nginx.conf 里: server unix:///to/your/project/uwsgi.sock;
uwsgi.conf 里: socket = /to/yout/project/uwsgi.sock;
这两个变量指向同一个东西,这样就建立了联系
2-6 相当重要的补充
.conf 需要被连接到 /etc/nginx/sites-enable/目录下
假如,你的nginx.conf文件所在地址为 /to/your/prject/p_nginx.conf
那么,需要输入如下命令,让nginx开启时可以找到这个配置文件并运行
sudo ln -s /to/your/project/p_nginx.conf /etc/nginx/sites-enable/
2-7 检查errorlog
检查你的nginx error log( 位置: /var/log/nginx/error.log ).
如果你看到如下信息,说明可能是权限问题导致网站无法访问(特别是你把sock文件放在/tmp目录下)
connect() to unix:///path/to/your/project/uwsgi.sock failed (13: Permission denied)
通过 修改chmod-socket的权限 , 可以避免
uwsgi --socket /tmp/uwsgi.sock --wsgi-file test.py --chmod-socket=644 # 666 permissions (very permissive)
3 nginx+uwsig 互联需要注意的地方
情况1:
如果单用uwsgi运行,ini配置文件里,直接写http地址和端口
# uwsgi.ini
http = IP:PORT
# uwsgi.ini
http = 127.0.0.1:8006
情况2:
如果nginx+uwsgi运行,ini 的 conf配置文件里,分三种情况:
# -1- 指定ip和端口
# uwsgi.ini
socket = IP:PORT
# nginx.conf
upstream boxx{
server IP:PORT
}
# -2- 本地ip和端口
# uwsgi.ini
socket = 127.0.0.1:8003
# nginx.conf
upstream boxx{
server 127.0.0.1:8003
}
# -3- 指定uwsgi.sock
# uwsgi.ini
socket = /to/your/project/uwsgi.sock
# nginx.conf
upstream boxx{
server unix:///to/your/project/uwsgi.sock
}