前段时间弄了个 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.sh
和 stop.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'
启动
- 首先是要先启动
Nginx
,sudo service nginx start
- 之后运行上面写好的
run.sh
完成!
来自个人 Python 文集