Django 部署记录

作者: 一名普通用户 | 来源:发表于2017-07-24 23:14 被阅读0次

前段时间弄了个 Django 的程序,为了在服务器上跑起来,花费了不少的时间搜索相关内容,现在记录下来。

运行条件

云主机 + Ubuntu server 16.04.2 LTS + Nginx 1.10 + Django 1.10 + uWSGI 2.0.14

修改 Nginx 配置

服务器上用了 https ,可以参照我之前的记录提前弄好。
《Let's Encrypt 使用记录 - 简书》

使用之前当然要先安装,简单地使用 apt 命令安装即可

 sudo apt install nginx

安装后用终端切换到/etc/nginx/sites-enable/ 下,新建 project-https 文件(https用),输入以下内容:

server {
    listen 443 ssl;
    server_name domain.com
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:6666;
    }
    location /static {
        root /var/www/project-html;
    }
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
    ssl_dhparam /etc/ssl/certs/dhparams.pem;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;

127.0.0.1:6666 这个参数要在后面用到,在这里可以提前决定Django 使用哪一个端口号。
uwsgi_params 的文件内容会在后面提及。
location /static是在 Django admin 中用到的 html 和 js 文件,复制过去就好,剩下的带 ssl 的参数就请按照上面给出的链接做吧。

然后在同样的目录下新建project-http2https文件(用于http 跳转到 https),输入以下内容:

server {
    listen 80;
    server_name domain.com
    return 301 https://$server_name$request_uri;
}

http 状态码 中 301 代表 Moved Permanently,意为永久移动。
最后的是 request_uri 并非 request_url,这算是之前在输入的时候没有仔细留意到的一点,多花了点时间。

切换到 /etc/nginx/ ,补充在 https 用的文件中用到的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;

安装 uWSGI

pip 即可。

pip install  -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi

-i 后面表示从国内的镜像站下载,速度会快不少。这是个小窍门。

修改 Django 设置

在项目设置的目录中添加uwsgi_file.py文件,文件内容如下:

import os,sys
import django.core.handlers.wsgi
import django

sys.path.append(os.path.abspath(os.path.dirname(__file__)))
sys.path.append('/home/ubuntu/project/')
os.environ['DJANGO_SETTINGS_MODULE']='project.settings'
django.setup()
application = django.core.handlers.wsgi.WSGIHandler()

第五行中的地址要根据自己的项目文件位置设置,例子中是放在/home/ubuntu/project/ 中的,同样要留意的是接下来的第六行的填写。

为了方便,我弄了几个批处理文件run.shstop.sh,用chmod +x 给了执行权限。

  • run.sh
echo 'begin'
sudo uwsgi -s 127.0.0.1:6666 --chdir /home/ubuntu/project/project -p 10 -w uwsgi_file -d /home/ubuntu/status.log
echo 'done'

127.0.0.1:6666 ,留意到这一点了吗,这是由之前 Nginx 配置中所决定的。当然,不建议使用常见的端口,以免影响其他程序的使用。
--chdir 后面跟着的是项目的文件。
-p 后面所跟着的数字代表开多少个进程。
-w 后面跟着的是我们上面新建的文件。
-d 表示以后所有的程序状态都存到指定的文件中。

  • stop.sh
sudo kill -9 $(ps aux | grep 'uwsgi' | awk '{print $2}' )

stop.sh文件相比较之下就显得简单了,直接用kill杀死带 uwsgi 的进程。
你也可以新建一个detect.sh ,查看是否正常启动。内容如下

ps aux | grep 'uwsgi'

启动

  • 首先是要先启动 Nginxsudo service nginx start
  • 之后运行上面写好的 run.sh

完成!

来自个人 Python 文集

相关文章

网友评论

    本文标题:Django 部署记录

    本文链接:https://www.haomeiwen.com/subject/qndikxtx.html