本文环境
操作系统: Ubuntu 16.04.3
Python版本: 3.5.2
Django版本: 2.0.4
nginx版本: 1.10.3
本文平台为腾讯云1核1G系统
我的项目文件名为:dgutpsy
安装pip3(python3 的pip)
sudo apt-get install python3-pip
安装成功后运行pip3
将会出现
安装uwsgi
pip install uwsgi
测试uwsgi运行状态
新建文件test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
有些教程说是return "hello world"
但是这样其实会出现访问空白的情况, 我的是Python3的环境,需要对hello world进行编码.
而如果你是Python2的环境,你应该写return "hello world"
使用uwsgi运行该文件
uwsgi --http :8000 --wsgi-file test.py
此语句的意思是,使用uwsgi运行test.py文件, 采用http模式, 端口8000
访问页面
好啦,可以看到亲切的hello world 就说明uwsgi运行成功了
TIPS: 如果你访问不了,请先检查腾讯云安全组端口是否开放8000端口
安装Django
pip3 install Django
如在python3里面import django没有报错则安装成功.
上传项目代码
现在我们开始上传项目代码
使用MobaXterm的sftp工具拖进来,[笑着哭]不要问我为什么不用ftp,这个方便.
确认代码运行正常
切进项目目录,运行
python3 manage.py runserver 0.0.0.0:8000
访问页面
不太对?这是因为设置了ALLOWED_HOSTS的原因
我们在setting.py里设置一下
ALLOWED_HOSTS = ['*']
再次访问页面
OK!
uswgi运行项目
uwsgi --http :8000 --chdir /home/ubuntu/dgutpsy --wsgi dgutpsy.wsgi
这个语句的意思与上相似,只不过是多了一个工作路径和wsgi文件
开什么玩笑? 你觉得没变化?
至此
我们可以暂定以下内容
- 项目没问题.
- 项目配置没问题
- uwsgi没问题
- 对项目的支持环境没问题
接下来, 我们开始配置nginx
安装nginx
sudo apt-get install nginx
测试nginx运行状态
nginx 安装成功
修改nginx配置
文件路径"/etc/nginx/sites-enabled/default"
别再费力找nginx.conf啦,新版本已经没有这个文件的.
我的
upstream django {
server 127.0.0.1:8001; #web的socket端口
}
server {
listen 80 default_server;
listen [::]:80 default_server;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
root /home/ubuntu/dgutpsy; #项目目录
uwsgi_pass django;
include /home/ubuntu/dgutpsy/uwsgi_params; #uwsgi_params文件的地址
}
}
完整的uwsgi_params文件内容应该是
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
没有这个文件,或者这个文件写错是会报错的哦.
访问测试502
这是因为我们的socket通信还没开始呢!
nginx 与 uwsgi通信
先使用hello world测试
uwsgi --socket :8001 --wsgi-file test.py
访问测试页面
至此: nginx 与 uwsgi通信成功!
TIPS: 这里你是无法通过在浏览器里面访问8001端口来判断是否启动的,因为它是socket协议
让uwsgi后台运行
这样虽然看似可以, 但是当你关闭ssh时,又会出现502了!这是因为当你关闭这个ssh进程时,uwsgi进程也被终止了.
而且,每次启动都要输一串好长的命令,好不麻烦!
这个时候,我们需要用到一个东西, 那就是ini配置文件启动.
其中daemonize = /home/ubuntu/dgutpsy/test.log
的意思就是后台运行并规定日志输出目录。
新建test.ini
[uwsgi]
socket = 127.0.0.1:8001
wsgi-file = /home/ubuntu/dgutpsy/test.py
daemonize = /home/ubuntu/dgutpsy/test.log
uwsgi --ini test.ini
niginx与Django项目通信
新建dgutpsy.ini
[uwsgi]
socket = 127.0.0.1:8001
chdir = /home/ubuntu/dgutpsy
module = dgutpsy.wsgi
master = true
processes = 1
threads = 2
max-requests = 6000
daemonize = /home/ubuntu/dgutpsy/run.log
然后运行
uwsgi --ini dgutpsy.ini
域名映射
添加域名>解析consult.psyannabel.cn
访问页面
后记:
Q&A:
Q: 能用manage.py运行的,为什么要用uwsgi?A: 单进程的manage.py, 能和web服务器uwsgi比maQ: 能用uwsgi的,为什么还要用nginx?
A: uwsgi虽然是web服务器, 但是它在处理静态文件时, 并没有nginx来得优秀.Q: 大致流程?
A: nginx运行web处理http请求, nginx使用socket与uwsgi通信,将动态部分转让交给uwsgi处理Q: 为啥我的test.py运行不了?
A: 如果端口开放没有问题,那么请检查Python版本对应的return
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。