Yellowpython 2019-06-27
本文环境
操作系统: Ubuntu 16.04.3
Python版本: 3.5.2
Django版本: 2.0.4
nginx版本: 1.10.3
本文平台为腾讯云1核1G系统
我的项目文件名为:dgutpsy
sudo apt-get install python3-pip
安装成功后运行pip3
将会出现
pip install 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 --http :8000 --wsgi-file test.py
此语句的意思是,使用uwsgi运行test.py文件, 采用http模式, 端口8000
好啦,可以看到亲切的hello world 就说明uwsgi运行成功了
TIPS: 如果你访问不了,请先检查腾讯云安全组端口是否开放8000端口
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!
uwsgi --http :8000 --chdir /home/ubuntu/dgutpsy --wsgi dgutpsy.wsgi
这个语句的意思与上相似,只不过是多了一个工作路径和wsgi文件
开什么玩笑? 你觉得没变化?
我们可以暂定以下内容
接下来, 我们开始配置nginx
sudo apt-get install 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;
没有这个文件,或者这个文件写错是会报错的哦.
这是因为我们的socket通信还没开始呢!
先使用hello world测试
uwsgi --socket :8001 --wsgi-file test.py
至此: nginx 与 uwsgi通信成功!
TIPS: 这里你是无法通过在浏览器里面访问8001端口来判断是否启动的,因为它是socket协议
这样虽然看似可以, 但是当你关闭ssh时,又会出现502了!这是因为当你关闭这个ssh进程时,uwsgi进程也被终止了.
而且,每次启动都要输一串好长的命令,好不麻烦!
这个时候,我们需要用到一个东西, 那就是ini配置文件启动.
其中daemonize = /home/ubuntu/dgutpsy/test.log
的意思就是后台运行并规定日志输出目录。
[uwsgi] socket = 127.0.0.1:8001 wsgi-file = /home/ubuntu/dgutpsy/test.py daemonize = /home/ubuntu/dgutpsy/test.log
uwsgi --ini test.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