python3 + Django + uwsgi + nginx 配置部署笔记

本文环境

操做系统: Ubuntu 16.04.3
Python版本: 3.5.2
Django版本: 2.0.4
nginx版本: 1.10.3html

本文平台为腾讯云1核1G系统
个人项目文件名为: dgutpsy

安装pip3(python3 的pip)

sudo apt-get install python3-pip

2018-04-10-20-07-25.png

安装成功后运行 pip3将会出现

2018-04-10-20-09-19.png

安装uwsgi

pip install uwsgi

2018-04-10-20-17-19.png

测试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

2018-04-10-20-44-49.png

访问页面

好啦,能够看到亲切的hello world 就说明uwsgi运行成功了

2018-04-10-20-39-21.png

TIPS: 若是你访问不了,请先检查腾讯云安全组端口是否开放8000端口

安装Django

pip3 install Django
如在python3里面import django没有报错则安装成功.

2018-04-10-20-55-49.png

上传项目代码

如今咱们开始上传项目代码

2018-04-10-20-42-25.png

使用MobaXterm的sftp工具拖进来,[笑着哭]不要问我为何不用ftp,这个方便.

确认代码运行正常

切进项目目录,运行
python3 manage.py runserver 0.0.0.0:8000

2018-04-10-20-59-03.png

访问页面

2018-04-10-21-01-32.png

不太对?这是由于设置了ALLOWED_HOSTS的缘由
咱们在setting.py里设置一下
ALLOWED_HOSTS = ['*']

再次访问页面

2018-04-10-21-05-34.png

OK!

uswgi运行项目

uwsgi --http :8000 --chdir /home/ubuntu/dgutpsy  --wsgi dgutpsy.wsgi
这个语句的意思与上类似,只不过是多了一个工做路径和wsgi文件
2018-04-10-21-05-34.png
开什么玩笑? 你以为没变化?

至此

咱们能够暂定如下内容
  1. 项目没问题.
  2. 项目配置没问题
  3. uwsgi没问题
  4. 对项目的支持环境没问题

接下来, 咱们开始配置nginx

安装nginx

sudo apt-get install nginx

测试nginx运行状态

2018-04-10-21-18-53.png

nginx 安装成功

修改nginx配置

文件路径 "/etc/nginx/sites-enabled/default"

别再费力找nginx.conf啦,新版本已经没有这个文件的.python

个人
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文件内容应该是nginx

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

2018-04-10-21-37-49.png

这是由于咱们的socket通讯还没开始呢!

nginx 与 uwsgi通讯

先使用hello world测试
uwsgi --socket :8001 --wsgi-file test.py

访问测试页面

图片描述


至此: nginx 与 uwsgi通讯成功!web

TIPS: 这里你是没法经过在浏览器里面访问8001端口来判断是否启动的,由于它是socket协议

让uwsgi后台运行

这样虽然看似能够, 可是当你关闭ssh时,又会出现502了!

这是由于当你关闭这个ssh进程时,uwsgi进程也被终止了.
并且,每次启动都要输一串好长的命令,好不麻烦!shell

这个时候,咱们须要用到一个东西, 那就是ini配置文件启动.
其中daemonize = /home/ubuntu/dgutpsy/test.log的意思就是后台运行并规定日志输出目录。django

新建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

而后运行ubuntu

uwsgi --ini dgutpsy.ini

域名映射

添加域名>解析consult.psyannabel.cn浏览器

访问页面

后记:

Q&A:
Q: 能用manage.py运行的,为何要用uwsgi?安全

A: 单进程的manage.py, 能和web服务器uwsgi比ma

Q: 能用uwsgi的,为何还要用nginx?服务器

A: uwsgi虽然是web服务器, 可是它在处理静态文件时, 并无nginx来得优秀.

Q: 大体流程?

A: nginx运行web处理http请求, nginx使用socket与uwsgi通讯,将动态部分转让交给uwsgi处理

Q: 为啥个人test.py运行不了?

A: 若是端口开放没有问题,那么请检查Python版本对应的return
相关文章
相关标签/搜索