Ubuntu下的Nginx+Uwsgi+Django项目部署详细流程
版本
- Ubuntu 18.04
- Python 3.6
- Django 3.2
- Nginx 1.14.0
Python 虚拟环境
- virtualenv是虚拟环境安装包,创建虚拟环境可以更好地控制包的版本,保证了项目的稳定性
- 不同虚拟环境之间的运行环境相互独立,互不干扰
1.安装virtualenv
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
2.创建虚拟环境
virtualenv myVenv
3.进入虚拟环境
source myVenv/bin/activate
Django项目代码上传
1.通过pycharm进行代码部署
- 选择:工具-Deployment-Configuration
- 点击 + 号,选择SFTP连接
- 选择远程主机
- 选择本地目录与上传目录
- 选择文件后进行上传
2.项目试运行
python3 manage.py runserver 0.0.0.0:8000
uWSGI 安装配置
1.Python 安装 uWSGI
在虚拟环境下安装uWSGI
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi
2.测试uWSGI
从一个简单的 “Hello World” 开始,创建文件 test_uwsgi.py,代码如下:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
uWSGI Python 加载器将会搜索的默认函数 application 。
接下来我们启动 uWSGI 来运行一个 HTTP 服务器,将程序部署在HTTP端口 8001 上:
uwsgi --http :8001 --wsgi-file test_uwsgi.py
uWSGI部署Django
在项目根目录下(与manage.py同级)新建一个uwsgi.ini文件,内容如下:
[uwsgi]
socket = 0.0.0.0:8001
chdir = /data/myobject/
wsgi-file = myobject/wsgi.py
processes = 4
threads = 2
buffer-size = 65536
# .sock文件目录需与Nginx文件内的配置相同
# socket = /data/myobject/my_sock.sock
# chmod-socket = 666
# 存储pid进程
pidfile=uwsgi.pid
# 存储log日志
daemonize=uwsgi.log
启动uWSGI,并指定配置文件
uwsgi --ini uwsgi.ini
- 可以看到,文字正常显示,图片无法显示,这是正常现象
- 以上步骤说明以下三个环节是相通的
web client <-> uWSGI <-> Django
Nginx
1.安装Nginx
sudo apt-get install nginx
2.Nginx命令
/usr/sbin/nginx # 启动Nginx
/usr/sbin/nginx -s stop # 停止Nginx
/usr/sbin/nginx -s reload # 重新启动Nginx
vi /etc/nginx/nginx.conf # 编辑Nginx配置文件
3.测试Nginx
启动Nginx后,浏览器访问ip地址:
看到如上页面,说明Nginx启动成功。
4.配置Nginx
将/etc/nginx/目录下的uwsgi_params复制到项目文件夹,对此文件不做任何改动
cp /etc/nginx/uwsgi_params /data/myobject
在项目根目录创建文件my_nginx.conf,并写入以下内容
upstream django {
server 0.0.0.0:8001;
# server unix:///data/myobject/my_sock.sock;
}
server {
listen 8000; # 端口号
server_name 127.0.0.1; # 服务器 ip 或是域名
charset utf-8; # 字符集
# 最大上传限制
client_max_body_size 75M;
location /static {
alias /data/myobject/static; # 静态文件所在文件夹
}
# 将所有非媒体请求转到Django服务器上
location / {
uwsgi_pass django; # 最上方已定义
# 将所有参数都转到uwsgi下
include /data/myobject/uwsgi_params; # uwsgi_params的路径
}
}
这个配置文件表示将静态文件和媒体文件由Nginx处理,而其它的请求转入uWSGI处理
与Nginx配置目录建立软链接
sudo ln -s /data/myobject/my_nginx.conf /etc/nginx/sites-enabled/
Nginx & uWSGI & Django
1.测试Nginx
将一张测试图片test.jpg放入static文件夹中,在浏览器中输入<YOUR_SERVER_IP>:8000/static/test.jpg,如果出现403则将图片的权限改为666,成功显示图片。
2.测试uWSGI
回到项目根目录,输入以下命令
uwsgi --socket :8001 --wsgi-file test_uwsgi.py
打开浏览器,地址栏输入<YOUR_SERVBER_IP>,看是否能正常显示’Hello World’。
3.用UNIX socket取代TCP port
修改my_nginx.conf,最终版如下:
upstream django {
# server 0.0.0.0:8001;
server unix:///data/myobject/my_sock.sock;
}
server {
listen 8000; # 端口号
server_name 127.0.0.1; # 服务器 ip 或是域名
charset utf-8; # 字符集
# 最大上传限制
client_max_body_size 75M;
location /static {
alias /data/myobject/static; # 静态文件所在文件夹
}
# 将所有非媒体请求转到Django服务器上
location / {
uwsgi_pass django; # 最上方已定义
# 将所有参数都转到uwsgi下
include /data/myobject/uwsgi_params; # uwsgi_params的路径
}
}
修改uwsgi.ini,最终版如下:
# socket = 0.0.0.0:8001
chdir = /data/myobject/
wsgi-file = myobject/wsgi.py
processes = 4
threads = 2
buffer-size = 65536
# .sock文件目录需与Nginx文件内的配置相同
socket = /data/myobject/my_sock.sock
chmod-socket = 666
# 存储pid进程
pidfile=uwsgi.pid
# 存储log日志
daemonize=uwsgi.log
重启Nginx和uWSGI
/usr/sbin/nginx -s reload
uwsgi --stop uwsgi.pid
uwsgi --ini uwsgi.ini
打开浏览器,地址栏输入网址<YOUR_SERVER_IP>:8000,查看图片和文字是否显示正常
此时以下环节已全部打通
web client <-> web server(nginx) <-> the socket <-> uwsgi <-> Django