引子:
需要将Django部署在服务器上,为微信小程序提供后台支持。虽然有着大量教程,但是其中给的配置文件的详细内容很模
糊。我比照着官方文档和多个教程才搞清楚所有流程。
目录
应用Nginx配置文件(mysite_nginx.conf)
环境和准备
准备
- 一个可用的、简单的Django项目,如"Hello World!",最后用于测试环境是否搭建成功
- 一个testuwsgi.py文件,用于测试uWSGI服务是否搭建好,文件内容在后面给出
环境
我使用的是阿里云轻量级服务器,系统是 Ubuntu16.04 x64
使用默认的Python3,版本是3.5.2
(由于使用Django2.0的原因,Python版本最低不要小于3.5.0)
首先,习惯性地对新服务器的包管理器进行更新
apt-get update
apt-get upgrade
如有需要,请在以下所有命令前加上 'sudo' 使用超级管理员权限运行
pip3
手动安装了pip3,命令如下:
apt-get install python3-pip
virtualenv
# 使用pip3安装可以使得virtualenv创建环境时使用Python 3.5.2作为基环境
pip3 install virtualenv
# 查看是否已经安装好
pip3 list
uWSGI
pip3 install uwsgi
Nginx
apt-get install nginx
# 这个时候访问服务器的IP地址会出现Nginx的欢迎界面,说明安装正常
配置项目路径和virtualenv虚拟运行环境
确定你Django项目放在哪
首先大体看一下我的文件目录
/root/ls
|--project
| |
| |--lsdemo # 项目文件夹
| |
| |--venv # 运行用python虚拟环境
|
|--deploy # 配置文件用文件夹
|
|--mysite_nginx.conf # Nginx配置文件
|
|--uwsgi_params # Nginx关于配置Django用的参数文件
|
|--mysite_uwsgi # uwsgi关于Django的配置文件
在你喜欢的、并且有足够操作权限的位置(像是~/、/var/www/),新建一个文件夹,并赋予权限
在下面,我会统一称之为工作目录
例如:
我的工作目录叫 ls
我的Django项目叫做 lsdemo
我的lsdemo将会放在 /root/ls/project/ 下
# 例如在/root下创建ls文件夹
# 接下来所有的配置文件和项目我都将会放在这个文件夹下进行演示
# 如果需要更改为其他目录,请务必自行配置好相应的配置文件中的路径
cd /root
mkdir ls
sudo chmod 777 /root/ls
新建一个Python虚拟环境
cd /root/ls
# 创建一个project文件夹用于存放Django项目和虚拟的Python运行环境
mkdir project
cd project
# 新建一个虚拟环境venv
virtualenv venv
配置Nginx
新建Nginx配置文件目录以及Nginx配置文件
创建配置文件目录
在工作目录中,新建一个deploy文件夹,用于存放Nginx的配置文件
cd /root/ls
mkdir deploy
cd deploy
在deploy下创建 mysite_nginx.conf
首先是 mysite_nginx.conf
# 首先创建Nginx配置文件
touch mysite_nginx.conf
# 编辑mysite_nginx.conf文件
vim mysite_nginx.conf
mysite_nginx.conf 文件内容:
# mysite_nginx.conf
events {
worker_connections 1024;
}
http{
# the upstream component nginx needs to connect to
upstream django {
# 监听内部地址 127.0.0.1:8080
# 通过这个监听设置来对应uWSGI部署的8080端口
server 127.0.0.1:8080;
}
# configuration of the server
server {
# http的监听端口,默认用80
listen 80;
# 普通填写localhost,如果需要使用域名,并已经将域名解析到该服务器,一定要重新填写为相应域名,并重载Nginx配置
server_name localhost;
charset utf-8;
# 使用默认值就好
client_max_body_size 75M; # adjust to taste
# Django的media目录,根据实际的项目名称和目录进行设置,以我的为例
location /media {
alias /root/ls/project/lsdemo/media;
}
location /static {
alias /root/ls/project/lsdemo/static;
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
# 加载另一个所需要的Nginx关于Django的配置文件
include /root/ls/deploy/uwsgi_params;
}
}
}
在deploy下创建 uwsgi_params
其次是 uwsgi_params
(没有后缀名,这个文件是官方给出的,注意与上个配置文件中所写配置的路径一致)
# 创建Nginx关于Django的配置文件
touch uwsgi_params
# 编辑uwsgi_params文件
vim 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;
应用Nginx配置文件(mysite_nginx.conf)
# 停止Nginx服务
/etc/init.d/nginx stop
# 使用自己的配置启动Nginx
sudo nginx -c /root/ls/deploy/mysite_nginx.conf
# 这个时候访问服务器IP地址,会出现502页面,说明配置生效
# 如果没有出现502 你应该检查你的配置,继续出现欢迎界面可不是个好兆头
# 出现502错误是因为我们还没有将Django通过uWSGI将访问地址映射到相应的端口,即Django还未部署
配置uWSGI服务
测试uWSGI是否可用
在 /root/ls/project 下新建一个testuwsgi.py文件
# 创建testuwsgi.py,用于测试uWSGI服务
touch testuwsgi.py
# 编辑uwsgi_params文件
vim testuwsgi.py
testuwsgi.py 内容如下:
# testuwsgi.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
测试是否可以正常访问
uwsgi --http :8000 --wsgi-file /root/ls/project/testuwsgi.py
访问 [服务器外网ip:8000]
显示 Hello World则是可以正常使用uWSGI服务
编辑关于Django项目(lsdemo)的uWSGI配置
首先在 /root/ls/deploy 下新建一个配置文件
cd /root/ls/deploy
touch mysite_uwsgi.ini
编辑 mysite_uwsgi.ini文件,内容如下:
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# 填写Django项目的绝对路径
chdir = /root/ls/project/lsdemo
# [Django项目名].wsgi
module = lsdemo.wsgi
# 使用的虚拟运行环境的绝对路径
home = /root/ls/project/venv
# process-related settings
# master 默认设置
master = true
# 最大进程数,小项目推荐4个
processes = 4
# the socket (use the full path to be safe
# socket = /path/to/your/project/mysite.sock
# socket的端口填写一定要对应着Nginx配置文件中在内部环境中监听的端口,即127.0.0.1:8080 8080端口
socket = :8080
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
准备好你的Django项目(我的lsdemo已经准备好在相应目录了)
最后,部署上线
记得所有配置文件准备好后,重载一下Nginx配置文件
uwsgi --ini /root/ls/deploy/mysite_uwsgi.ini
参考文献:
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Nginx.html
https://blog.csdn.net/weixin_39198406/article/details/79277580
https://blog.csdn.net/qq_41500222/article/details/82263239
https://www.cnblogs.com/qingspace/p/6838747.html
https://github.com/nginx/nginx/blob/master/conf/uwsgi_params