基于物理机部署前后端不分离项目--->nginx+uwsgi+socket+django+负载均衡

     阅读:24

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_t1
    cdvirtualenv
    pwd

# 我的虚拟环境位置,用你自己的位置,不然会包报错
/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.css
    server_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/