1. 介绍
- nginx+uwsgi+socket+django
- 本文也有介绍http启动流程,以及socket与http启动的差别
- 本文基于ubuntu20.04部署
- 本文适用于16.04版本以上的ubuntu参考
- 使用root用户进行部署
1.2 uwagi
1.2.1 介绍
1.nginx支持静态文件处理性能更好, django uwsgi,默认不支持静态文件解析
2-nginx的负载均衡特性,让网站并发性更高
3.并且反向代理特性,用户访问80,即可访问到8000的应用
4.uwsgi支持多进程的方式,启动django,性能更高
5.nginx转发请求给uwsgi ,应该用uwsgI_pass,实现了uwsgi协议的请求转发
1.2.2 uwsgi启动django的命令
uwsgi --http :8088 --module crm.wsgi --py-autoreload=1--http 指定用http协议
:8088 指定ob_crm启动的端口
-—module 指定django的wsgi.py的文件位置(绝对路径) 你的django项目第二层的目录名,下面的wsgi.py
—-py-autoreload=1 开启uwsgi的热加载功能# 指定你的django启动在什么地址上,并且是什么协议
# 如果你用了nginx,进行反向代理,请用socket参数,用socket会导致无法直接访问,只能用nginx转发
socket=0.0.0.0:8000
# 如果你没用nginx反向代理,想要直接访问django用这个参数
http=0.0.0.0:8000
2. 踩得坑
- 博主之前是centos7.5的忠实粉丝,听说ubuntu很香,就过来了,一用确实很香
- 使用ubuntu的时候,注意sudo的使用,不可盲目使用,
- 你的虚拟环境装在了普通用户上,你用sudo去启动uwsgi,会报一个错,no python application found, check your startup logs for errors
- 你的nginx环境变量配置在了全局,普通用户是无法使用的
no python application found解决方案https://blog.csdn.net/qq_52385631/article/details/123842710?spm=1001.2014.3001.5501
3. 准备环境
准备项目
# 我的放在/opt 下
git clone https://gitee.com/yqmc/hun_pro.git
准备虚拟环境
mkvirtualenv nginx_t1
查看虚拟环境的位置
查找虚拟环境的绝对路径,一会uwsgi配置的时候使用workon nginx_t1cdvirtualenvpwd# 我的虚拟环境位置,用你自己的位置,不然会包报错
/root/.virtualenvs/nginx_t1
安装环境
- 进入项目manage.py所在的目录
pip3 install -r requirement.txt -i https://pypi.douban.com/simple
pip3 install uwsgi -i https://pypi.douban.com/simple
uwsgi的命令
启动:
uwsgi --ini uwsgi.ini停止:
uwsgi --stop uwsgi.pid重启:
uwsgi --reload uwsgi.pid
按照自己的路径,修改uwsgi.ini
- 我们先以http + 前台启动,一会换成socket+后台运行
- vim uwsgi.ini
# uwsgi.ini 配置
# mysite_uwsgi.ini file
[uwsgi]
# 填写你项目的绝对路径,第一层(你的项目位置)
chdir = /opt/hun_pro
# 找到django的那个wsgi.py文件(你的wsgi位置)
# 根据上面一条参数, hun_pro.wsgi
module = hun_pro.wsgi
#虚拟环境的绝对路径(你的虚拟环境位置)
home = /root/.virtualenvs/nginx_t1
# process-related settings
# master
master = true
# 根据你的cpu核数来定义这个参数,启动多少个进程
processes = 2
# 指定你的django启动在什么地址上,并且是什么协议
# 如果你用了nginx,进行反向代理,请用socket参数
#socket = 0.0.0.0:8000
# 如果你没用nginx反向代理,想要直接访问django用这个参数
http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
py-autoreload = 1
# 后台运行并记录日志
#daemonize = uwsgi.log
# pid
#pidfile = uwsgi.pid
http启动uwsgi,访问项目
- 改启动仅仅为了做一下测试,确保你可以访问项目
- 可以直接跳过,直接使用socket启动
- 必须在你uwsgi.ini 配置的虚拟环境中,进行启动(这是个坑,如果没在,会报错)
- 在uwsgi.ini所在的路径启动
# http + 前台启动启动
uwsgi --ini uwsgi.ini
# 访问 此时可以看到页面(ip换成你的IP)
http://10.0.0.129:8000
# 访问admin,会发现样式没有了,一会我们用nginx代理,就能解决
http://10.0.0.129:8000/admin/# 用socket会导致无法直接访问,只能用nginx做反向代理,才能访问。因为协议不一样
socket=0.0.0.0:8000
用http启动,可以直接访问项目,会导致项目暴露,不安全
http=0.0.0.0:8000
换成socket + 后台启动的配置
修改代码(vim uwsgi.ini)
- socket解开注释
- http注释
- daemonize 解开注释,日志都放在uwsgi.log里面
- pidfile 解开注释,进程pid都放在uwsgi.pid里面
socket = 0.0.0.0:8000
# 如果你没用nginx反向代理,想要直接访问django用这个参数
# http = 0.0.0.0:8000
# 后台运行并记录日志
daemonize = uwsgi.log
# pid
pidfile = uwsgi.pid
完整配置
# uwsgi.ini 配置
# mysite_uwsgi.ini file
[uwsgi]
# 填写你项目的绝对路径,第一层(你的项目位置)
chdir = /opt/hun_pro
# 找到django的那个wsgi.py文件(你的wsgi位置)
# 根据上面一条参数, hun_pro.wsgi
module = hun_pro.wsgi
#虚拟环境的绝对路径(你的虚拟环境位置)
home = /root/.virtualenvs/nginx_t1
# process-related settings
# master
master = true
# 根据你的cpu核数来定义这个参数,启动多少个进程
processes = 2
# 指定你的django启动在什么地址上,并且是什么协议
# 如果你用了nginx,进行反向代理,请用socket参数
socket = 0.0.0.0:8000
# 如果你没用nginx反向代理,想要直接访问django用这个参数
#http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
py-autoreload = 1
# 后台运行并记录日志
daemonize = uwsgi.log
# pid
pidfile = uwsgi.pid
静态文件的收集
- 进入settings,py配置
收集静态文件(我在settings.py中已经配置好了,路径是 STATIC_ROOT='/opt/static')
vim hun_pro/settings.py # 把最后一行 STATIC_ROOT 的注释解开
STATIC_ROOT='/opt/static'# 在manage.py处执行,下面的代码
python3 manage.py collectstatic
socket + 后台启动
- 必须在你uwsgi.ini 配置的虚拟环境中,进行启动(这是个坑,如果没在,会报错)
- 在uwsgi.ini所在的路径启动
# socket + 后台启动
uwsgi --ini uwsgi.ini
# 会发现无法访问,socket启动,只能用nginx做反向代理,才可以启动
http://10.0.0.129:8000
nginx的配置(nginx.conf)
反向代理的配置
server {listen 80;# 因为跑在了本地,所以localhost,如果跑在云服务器,换成相应的IP http://10.0.0.100/server_name localhost;#优先7,通用匹配,最低级匹配。所有的url都会进入这个路劲进行匹配,无论url是否正确,都会走# 钩子,负载均衡的配置upstream mydjango {server 10.0.0.129:8000;}location / {# uwsgi_pass mydjango;# 对应变量include uwsgi_params;}
}
静态文件的配置
server {listen 80;# 因为跑在了本地,所以localhost,如果跑在云服务器,换成相应的IP http://10.0.0.100/# 静态文件请求的路径,http://10.0.0.129:8000/static/admin/css/login.cssserver_name localhost;location /static {# root 网页根目录# alias 别名alias /opt/static;}
}
完整配置(nginx.conf)
#配置文件内容如下
# 进程数
worker_processes 1;
events {worker_connections 1024;
}
# 核心代码
http {include mime.types;default_type application/octet-stream;# 定义nginx访问日志的格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';# 访问日志的功能access_log logs/access.log main;# 推图片等静态文件压缩,提升传输效率gizp on;#server被称为虚拟主机,可以有多个
# 钩子,负载均衡的配置upstream mydjango {server 10.0.0.129:8000;}# 主机
server {listen 80;# 因为跑在了本地,所以localhost,如果跑在云服务器,换成相应的IP http://10.0.0.100/server_name localhost;#优先7,通用匹配,最低级匹配。所有的url都会进入这个路劲进行匹配,无论url是否正确,都会走location / {uwsgi_pass mydjango;# 对应变量include uwsgi_params;}location /static {# root 网页根目录# alias 别名alias /opt/static;}
}}
普通版nginx.conf配置
#配置文件内容如下
# 进程数
worker_processes 1;
events {worker_connections 1024;
}
# 核心代码
http {include mime.types;default_type application/octet-stream;# 定义nginx访问日志的格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';# 访问日志的功能access_log logs/access.log main;# 推图片等静态文件压缩,提升传输效率gizp on;#server被称为虚拟主机,可以有多个# 主机server {listen 80;# 因为跑在了本地,所以localhost,如果跑在云服务器,换成相应的IP localhost<--->http://10.0.0.100/server_name localhost;#优先7,通用匹配,最低级匹配。所有的url都会进入这个路劲进行匹配,无论url是否正确,都会走location / {# 因为socket用0.0.0.0启动,0.0.0.0默认绑定所有网卡,用0.0.0.0/10.0.0.129/127.0.0.1都可以uwsgi_pass 127.0.0.1:8000;# 对应变量include uwsgi_params;}location /static {# root 网页根目录# alias 别名alias /opt/static;}
}
}
nginx重启
常用命令
# 关闭防火请,不然nginx启动,无法访问
iptables -F(1) 启动:
nginx(2) 测试Nginx配置是否正确:
nginx -t(3) 平滑重启,重新读取nginx配置文件
nginx -s reload(4) 停止nginx:
nginx -s stop
访问页面
# 访问 此时可以看到页面(ip换成你的IP)
http://10.0.0.129# 访问admin,会发现样式有了
http://10.0.0.129/admin/