Ubuntu下的Nginx+Uwsgi+Django项目部署详细流程
版本
Ubuntu 18.04Python 3.6Django 3.2Nginx 1.14.0Python 虚拟环境
virtualenv是虚拟环境安装包,创建虚拟环境可以更好地控制包的版本,保证了项目的稳定性不同虚拟环境之间的运行环境相互独立,互不干扰1.安装virtualenv
pip3 install -i https://pypi.tuna./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./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:8001chdir = /data/myobject/ wsgi-file = myobject/wsgi.py processes = 4threads = 2buffer-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;# serverunix:///data/myobject/my_sock.sock;}server {listen8000; # 端口号server_name 127.0.0.1; # 服务器 ip 或是域名charsetutf-8; # 字符集# 最大上传限制client_max_body_size 75M;location /static {alias /data/myobject/static; # 静态文件所在文件夹}# 将所有非媒体请求转到Django服务器上location / {uwsgi_passdjango; # 最上方已定义# 将所有参数都转到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;serverunix:///data/myobject/my_sock.sock;}server {listen8000; # 端口号server_name 127.0.0.1; # 服务器 ip 或是域名charsetutf-8; # 字符集# 最大上传限制client_max_body_size 75M;location /static {alias /data/myobject/static; # 静态文件所在文件夹}# 将所有非媒体请求转到Django服务器上location / {uwsgi_passdjango; # 最上方已定义# 将所有参数都转到uwsgi下include /data/myobject/uwsgi_params; # uwsgi_params的路径}}
修改uwsgi.ini,最终版如下:
# socket = 0.0.0.0:8001chdir = /data/myobject/ wsgi-file = myobject/wsgi.py processes = 4threads = 2buffer-size = 65536# .sock文件目录需与Nginx文件内的配置相同socket = /data/myobject/my_sock.sockchmod-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