nginx+uWSGI+django+virtualenv+supervisor发布web服务器

nginx+uWSGI+django+virtualenv+supervisor发布web服务器

 导论

复制代码
WSGI是Web服务器网关接口。它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求)
基于wsgi运行的框架有bottle,DJango,Flask,用于解析动态HTTP请求
支持WSGI的服务器
    wsgiref
        python自带的web服务器
    Gunicorn
        用于linux的 python wsgi Http服务器,常用于各种django,flask结合部署服务器。
    mode_wsgi
        实现了Apache与wsgi应用程序的结合
    uWSGI
        C语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发。

在部署python程序web应用程序时,可以根据性能的需求,选择合适的wsgi server,不同的wsgi server区别在于并发支持上,有单线程,多进程,多线程,协程的区别,其功能还是近似,无非是请求路由,执行对应的函数,返回处理结果。




Django部署

Django的主要部署平台是 WSGI,这是用于Web服务器和应用程序的Python标准。

Django的 startproject管理命令设置一个简单的默认WSGI配置,可以根据需要为您的项目进行调整,并指示任何符合WSGI的应用程序服务器使用。

application 
使用WSGI部署的关键概念是应用程序服务器用于与代码通信的 application 可调用。它通常在服务器可访问的Python模块中作为名为 application 的对象提供。

startproject 命令创建包含这样的 application 可调用的文件 <project_name>/wsgi.py. ,它被Django的开发服务器和生产WSGI部署使用。
WSGI服务器从其配置中获取 application 可调用的路径。 Django的内置服务器,即 runserver 命令,从 WSGI_APPLICATION 设置读取它。
复制代码
复制代码
1 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx,

2nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,

如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

3要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况

1 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。

2负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。

3静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。
复制代码
复制代码
1.单机启动django项目,性能低,默认使用wsgiref模块,性能低的wsgi协议

python3 manager.py runserver 0.0.0.0:8000   > wsgiref模块中

2.高并发启动django,django是没有这个功能的,而uWSGI模块,遵循uwsgi协议,支持多进程处理django请求

uwsgi  通过他,启动你的django,而不再是python3 manager.py runserver 0.0.0.0:8000


3.公司中一般用 nginx + uwsgi + django + virtualenv  + supervisord(进程管理工具)


搭建笔记:
    1.确定依赖组件是否安装
    yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
    
    

    
    
nginx 正向代理,反向代理的概念




用户阿段,去访问mycrm.com:80 ,他想直接从80端口,找到hello视图,也就是mycrm.com:80/hello 
实现手段就是,阿段去访问 mycrm.com:80 这个nginx服务,并且让nginx,把hello这个请求,丢给后端的 uwsgi+django程序处理

1.基础环境准备好
yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

2.准备好python3环境

3.准备好virtualenv 

4.安装uWSGI
    1.激活虚拟环境
    source /opt/all_venv/venv2/bin/activate
    
    2.安装uWSGI
    (venv2) [root@s13linux ~ 05:18:21]$pip3 install uwsgi
    
    3.检查uwsgi版本
        (venv) [root@slave 192.168.11.64 /opt]$uwsgi --version
        2.0.17.1
        #检查uwsgi python版本
        uwsgi --python-version
    
    4.运行一个简单的uwsgi服务器
        1.创建一个test.py文件,写入内容
        def application(env, start_response):
            start_response('200 OK', [('Content-Type','text/html')])
            return [b"Hello World"] # python3
            
        2.然后用uwsgi命令启动
        uwsgi --http :8000 --wsgi-file test.py
            参数解释
            http :8000: 使用http协议,端口8000
            wsgi-file test.py: 加载指定的文件,test.py
        
    5.用uwsgi运行你的django项目(测试使用)
        1.准备好mysite,自己写好MTV视图函数  /hello 
    
    先确保你在项目文件夹下,例如/opt/mysite/底下
    
    uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1 
        参数解析
            --http 启动在8088端口,--module 指定项目文件夹路径  --py-autoreload是热加载程序
    
    6.配置nginx反向代理uwsgi+django!!!!(此步重要!!!)
        1.首先kill杀掉nginx进程
        2.配置nginx.conf,通过此步才能生效!!
            填入重要两个参数,根据自己目录结构配置,uwsgi_pass通过这个参数,nginx才能转发请求给后端0.0.0.0:9000的应用
            include  /opt/nginx112/conf/uwsgi_params;
            uwsgi_pass 0.0.0.0:9000;
        --------------------------分割线--------------------------------------------------------
             server {
                    listen       80;
                    server_name  mycrm.com;
                    location / {
                        include  /opt/nginx112/conf/uwsgi_params;
                        uwsgi_pass 0.0.0.0:9000;#这里也可以写ip池  先在server上方写upstream hello{ server 192.168.68.43:8080 weight=1#权重; server 192.168.68.45:8080 weight=1; }
                              然后这里的ip地址换成 hello(数据池名字) uwsgi_pass hello;

                root html; index index.html index.htm; #deny 10.0.0.1; } 配置nginx.conf之后,启动nginx服务,等待配置启动uwsgi+django 7.配置supervisor进程管理工具 1.通过python2的包管理工具easy_install安装 yum install python-setuptools easy_install supervisor 2.通过命令生成supervisor的配支文件 echo_supervisord_conf > /etc/supervisord.conf 3.写入/etc/supervisord.conf配置信息(参数根据自己环境填写) [program:my_crm] command=/opt/all_venv/venv2/bin/uwsgi --uwsgi 0.0.0.0:9000 --chdir=/opt/s13crm --home=/opt/all_venv/venv2/ --module=s13crm.wsgi directory=/opt/s13crm startsecs=0 stopwaitsecs=0 autostart=true autorestart=true 8.启动supervi服务,(同时启动uwsgi+django服务) 最后启动supervisor,完成uWSGI启动django,nginx反向代理 supervisord -c /etc/supervisord.conf #启动supervisor supervisorctl -c /etxc/supervisord.conf restart my #重启my项目 supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all] 9.此时访问网站mycrm.com ,查看是否可以通过80端口,访问到django应用,完成项目发布。 由于nginx的高并发性能,配合uwsgi的多进程性能,可以达到一个线上的django应用发布!!! 谢谢大家! 内容博客地址: https://www.cnblogs.com/pyyu/p/9481344.html
复制代码

nginx官网

http://nginx.org/en/

nginx有关uwsgi模块介绍

http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html

大家都学过了django,用django写了各种功能,写了bbs项目,写了路飞学城。

咱们都知道django是一个web框架,方便我们快速开发web程序,http请求的动态数据就是由web框架来提供处理的。

前面超哥也对nginx简单的介绍了,本文将nginx、WSGI、uwsgi、uWSGI、django这几个关系梳理一下。

wsgi    全称web server gateway interface,wsgi不是服务器,也不是python模块,只是一种协议,描述web server如何和web application通信的规则。
运行在wsgi上的web框架有bottle,flask,django
uwsgi    和wsgi一样是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型
uWSGI    是一个web服务器,实现了WSGI协议,uwsgi协议。a
nginx    web服务器,更加安全,更好的处理处理静态资源,缓存功能,负载均衡,因此nginx的强劲性能,配合uWSGI服务器会更加安全,性能有保障。
django 高级的python web框架,用于快速开发,解决web开发的大部分麻烦,程序员可以更专注业务逻辑,无须重新造轮子

逻辑图

web服务器

传统的c/s架构,请求的过程是
客户端 > 服务器 
服务器 > 客户端
服务器就是:1.接收请求 2.处理请求 3.返回响应

web框架层

HTTP的动态数据交给web框架,例如django遵循MTV模式处理请求。
HTTp协议使用url定位资源,urls.py将路由请求交给views视图处理,然后返回一个结果,完成一次请求。
web框架使用者只需要处理业务的逻辑即可。

如果将一次通信转化为“对话”的过程

Nginx:hello wsgi,我刚收到一个请求,你准备下然后让django来处理吧

WSGI:好的nginx,我马上设置环境变量,然后把请求交给django

Django:谢谢WSGI,我处理完请求马上给你响应结果

WSGI:好的,我在等着

Django:搞定啦,麻烦wsgi吧响应结果传递给nginx

WSGI:太棒了,nginx,响应结果请收好,已经按照要求传递给你了

nginx:好滴。我把响应交给用户。合作愉快

Django Nginx+uwsgi 安装配置

在前面的章节中我们使用 python manage.py runserver 来运行服务器。这只适用测试环境中使用。

正式发布的服务,需要一个可以稳定而持续的服务器。

基础开发环境配置

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

提前安装好python3环境

https://www.cnblogs.com/pyyu/p/7402145.html

virtualenv

请确保你的虚拟环境正常工作
https://www.cnblogs.com/pyyu/p/9015317.html

安装django1.11

pip3 install django==1.11
#创建django项目mysite
django-admin startproject mysite
#创建app01
python3 manage.py startapp app01

mysite/settings.py

#settings.py设置
ALLOWED_HOSTS = ['*']
install app01

mysite/urls.py

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello_django/', views.hello),
]

app01/views.py

复制代码
from django.shortcuts import render,HttpResponse

# Create your views here.
def hello(request):
    print('request is :',request)
    return HttpResponse('django is ok ')
复制代码

安装uWSGI

复制代码
进入虚拟环境venv,安装uwsgi
(venv) [root@slave 192.168.11.64 /opt]$pip3 install uwsgi
检查uwsgi版本
(venv) [root@slave 192.168.11.64 /opt]$uwsgi --version
2.0.17.1
#检查uwsgi python版本
uwsgi --python-version
复制代码

运行简单的uWSGI

复制代码
#启动一个python
uwsgi --http :8000 --wsgi-file test.py
  • http :8000: 使用http协议,端口8000
  • wsgi-file test.py: 加载指定的文件,test.py
#test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
复制代码

uWsgi热加载python程序

复制代码
在启动命令后面加上参数
uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1 
#发布命令
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi
#此时修改django代码,uWSGI会自动加载django程序,页面生效
复制代码

运行django程序

#mysite/wsgi.py  确保找到这个文件
uwsgi --http :8000 --module mysite.wsgi
  • module mysite.wsgi: 加载指定的wsgi模块

uwsgi配置文件

复制代码
uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在/etc/目录下新建uwsgi_nginx.ini,添加如下配置:

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /opt/mysite
# Django's wsgi file
module          = mysite.wsgi
# the virtualenv (full path)
home            = /opt/venv
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 1
# the socket (use the full path to be safe
socket          = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
复制代码

指定配置文件启动命令

uwsgi --ini  /etc/uwsgi_nginx.ini

配置nginx结合uWSGI

配置nginx.conf

复制代码
worker_processes  1;
error_log  logs/error.log;
pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    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;
    sendfile        on;
    keepalive_timeout  65;
  #nginx反向代理uwsgi server { listen 80; server_name 192.168.11.64; location / {
     #nginx自带ngx_http_uwsgi_module模块,起到nginx和uwsgi交互作用
#通过uwsgi_pass设置服务器地址和协议,讲动态请求转发给uwsgi处理 include /opt/nginx1-12/conf/uwsgi_params; uwsgi_pass 0.0.0.0:8000; root html; index index.html index.htm; }
     #nginx处理静态页面资源
     location /static{
        alias /opt/nginx1-12/static;   
}
     #nginx处理媒体资源
     location /media{
        alias /opt/nginx1-12/media;  
         }
error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
复制代码

配置完启动nginx

supervisor

supervisor 是基于 python 的任务管理工具,用来自动运行各种后台任务,当然你也能直接利用 nohup 命令使任务自动后台运行,但如果要重启任务,每次都自己手动 kill 掉任务进程,这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。

这里超哥要配置基于virtualenv的supervisor

由于supervisor在python3下无法使用,因此只能用python2去下载!!!!!!

#注意此时已经退出虚拟环境了!!!!!
yum install python-setuptools
easy_install supervisor

通过命令生成supervisor的配支文件

echo_supervisord_conf > /etc/supervisord.conf

然后再/etc/supervisord.conf末尾添加上如下代码!!!!!!

复制代码
supervisord.conf配置文件参数解释
[program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=tomcat          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程
复制代码
复制代码
[program:my]
#command=/opt/venv/bin/uwsgi --ini  /etc/uwsgi_nginx.ini  #这里是结合virtualenv的命令 和supervisor的精髓!!!!
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi
#--home指的是虚拟环境目录 --module找到 mysite/wsgi.py
复制代码

最后启动supervisor,完成uWSGI启动django,nginx反向代理

supervisord -c /etc/supervisord.conf #启动supervisor
supervisorctl -c /etxc/supervisord.conf restart my #重启my项目
supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all]

 重新加载supervisor

复制代码
一、添加好配置文件后

二、更新新的配置到supervisord    

supervisorctl update
三、重新启动配置中的所有程序

supervisorctl reload
四、启动某个进程(program_name=你配置中写的程序名称)

supervisorctl start program_name
五、查看正在守候的进程

supervisorctl
六、停止某一进程 (program_name=你配置中写的程序名称)

pervisorctl stop program_name
七、重启某一进程 (program_name=你配置中写的程序名称)

supervisorctl restart program_name
八、停止全部进程

supervisorctl stop all
注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。
复制代码

 django的静态文件与nginx配置

mysite/settings.py

STATIC_ROOT='/opt/nginx1-12/static'
STATIC_URL = '/static/'
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,"static"),
]

上述的参数STATIC_ROOT用在哪?

通过python3 manage.py collectstatic 收集所有你使用的静态文件保存到STATIC_ROOT!

STATIC_ROOT 文件夹 是用来将所有STATICFILES_DIRS中所有文件夹中的文件,以及各app中static中的文件都复制过来
# 把这些文件放到一起是为了用nginx等部署的时候更方便

 

 昨日内容回顾
1.nginx是什么
nginx是支持反向代理,负载均衡,且可以实现web服务器的软件

2.nginx如何实现404页面,access.log访问日志,多虚拟主机,反向代理等功能

nginx如果出现403(权限不足)的问题:
1.你的nginx代码放在了/root下
2.你的客户端被禁止访问了,去找nginx.conf中的配置



3.nginx负载均衡的实现
    1.准备三台机器,准备3台虚拟机,或者和俩同桌交流一下
        
        192.168.226.128  是nginx资源服务器,返回页面的
        192.168.226.129   用作nginx负载均衡服务器
        192.168.226.130   也用作nginx资源服务器
        
    2.分别配置三台机器
    确保 128和130这2台机器,能正确的资源返回即可
    这三个机器,都是通过修改nginx.conf来实现效果的
    128此时返回 超哥 一米五的 页面
    130返回  
    129配置反向代理
    
    
    3.配置关键点如下
    129负载均衡配置修改nginx.conf如下
    
    添加负载均衡地址池的参数
        #默认是轮询方式,两台服务器
    upstream s18django {
        server 192.168.226.128;
        server 192.168.226.130;
}
    添加反向代理参数如下
    proxy_pass http://s18django;

    4.配置完毕后,重启nginx,检测负载均衡效果
    
    访问192.168.226.129这个负载均衡器
    它会默认轮询的,丢给upstream中的地址池,每人一次
    
    
    5.nginx负载均衡的算法
        1.轮询方式
        2.加权轮询
            upstream s18django {
        server 192.168.226.128 weight=5;
        server 192.168.226.130 weight=5;
}
        3.ip_hash方式,对你的ip地址进行哈希,ip_hash方式不得与权重共用
        
    upstream s18django {
        server 192.168.226.128;
        server 192.168.226.130;
        ip_hash;
}
    
crm项目部署
1.nginx + uwsgi + django + 虚拟环境 + supervisor  + mysql


2.django的启动方式 python3 manage.py runserver 为什么不能在生产环境用?

django只是一个web逻辑框架,它通过python3 manage.py runserver命令启动的socket服务端
是借助python内置的wsgi框架 wsgiref框架实现的
它是一个单机模块,单进程模块,性能很低

因此在线上需要借助通过c语言编写的uwsgi这个web服务器软件,启动django


sanic 旋风小子
由低到高的性能框架
djano
flask
tornado
sanic



3.在进行uwsgi启动django的时候,是需要找到wsgi.py这个文件模块的

如果你报错提示 找不到application ,就是因为uwsgi  找不到wsgi.py



4.为什么要用nginx  和uwsgi?
nginx  可以解决uwsgi的静态文件问题,并且支持高并发请求,还能限流,保障后台服务器安全等等

为什么要用uwsgi
因为uwsgi支持多进程 多线程的方式,性能很高,启动django性能更好,但是uwsgi不解析django的静态文件

我们以后会收集所有的django项目静态文件,丢给nginx去处理

5.准备crm代码

6.准备一个新的虚拟环境,去启动crm,使用virtualenvwrapper创建新的虚拟环境

    1.解决虚拟环境依赖的问题,也就是保障本地开发环境和线上一致性的问题
    在windows本地 通过
    pip3 freeze > requirements.txt
    就能将    python3解释器中所有的模块导出到这个文件中
    

    2.将这个 requirements.txt  文件传输到服务器上,进行安装,就可以自动解决所有模块问题
    pip3 install -r requirements.txt  
    
7.使用uwsgi启动crm项目
确保进入虚拟环境,然后安装uwsgi

workon nginx_crm

下载uwsgi
pip3 install uwsgi


8.使用uwsgi命令启动django项目
uwsgi支持热加载的启动方式命令如下
uwsgi --http :8000 --module mysite.wsgi --py-autoreload=1


uwsgi --http :8088 --module Crm_Project.wsgi
    --http指定http协议启动在 8088端口
    --module 找到项目第二层的目录,里面的wsgi.py文件

如果你想启动一个http页面,提供测试访问,就用--http参数




如果你结合了nginx反向代理,必须用--socket参数
uwsgi --socket :8000 --module Crm_Project.wsgi

由于参数过多,这里引入配置文件的概念 叫做 uwsgi.ini     my.cnf    nginx.conf



#正式启动环境在这里
#正式启动环境在这里


启动crm的配置文件如下 uwsgi.ini内容如下


[uwsgi]
# Django-related settings
# the base directory (full path)
#填写项目的绝对路径(第一层路径)
chdir           = /opt/Crm_Project
# Django's wsgi file
#填写crm第二层目录下的wsgi.py文件的路径
module          = Crm_Project.wsgi
# the virtualenv (full path)
#填写虚拟环境的绝对路径
home            = /root/Envs/nginx_crm

# process-related settings
# master
master          = true
# maximum number of worker processes
#基于uwsgi的多进程,根据cpu来优化
processes       = 4
# the socket (use the full path to be safe


#如果你用了nginx反向代理,就填写socket参数
#如果你用了nginx反向代理,就填写socket参数
socket          = 0.0.0.0:8000

#如果你没用nginx,想直接通过浏览器测试后端,使用http
#http = 0.0.0.0:8000

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true


此时通过uwsgi --ini  uwsgi.ini方式启动代码

10.配置crm收集所有的crm静态文件
编辑项目的settings.py 写入如下参数
STATIC_ROOT= '/opt/crmstatic'


11.执行命令,收集crm所有的静态文件
python3 manage.py collectstatic

#此时后端的配置完毕!!!!开始搞nginx
#此时后端的配置完毕!!!!开始搞nginx
#此时后端的配置完毕!!!!开始搞nginx
#此时后端的配置完毕!!!!开始搞nginx
#此时后端的配置完毕!!!!开始搞nginx


12.配置nginx,一是支持反向代理,二是支持静态文件加载
修改nginx.conf

代码如下
        #当用户访问 www.s18dnf.com的时候,就进入这个虚拟主机
        location / {
        uwsgi_pass  0.0.0.0:8000;
        include uwsgi_params;
        }
 #下面这个location是解决crm的静态文件的问题的,把他放到与上面代码同一个server中
location /static  {
#alias参数 就是将/static转化为/opt/crmstatic ,也就找到了我们所有的静态文件
alias /opt/crmstatic;
}



13.重启nginx 查看反向代理效果



14.配置supervisro工具
注意要退出虚拟环境
注意要退出虚拟环境
注意要退出虚拟环境

    1.安装easy_install
    pip3是python3的软件包管理工具
    easy_install 是python2的软件包管理工具
    
    yum install python-setuptools

    2.安装supervisor
    easy_install supervisor
    
    3.创建supervisor的配置文件
    
    echo_supervisord_conf >  /etc/supervisor.conf

    4.修改supervisor的配置文件,添加启动uwsgi的命令
    
    supervisor其实就是帮咱们执行了,需要手动执行的命令而已
    vim /etc/supervisor.conf
    写入如下内容,在最底部写
[program:s18crm]
command=/root/Envs/nginx_crm/bin/uwsgi  --ini /opt/Crm_Project/uwsgi.ini
stopasgroup=true
killasgroup=true

[program:s18crm2]
command=/root/Envs/nginx_crm/bin/uwsgi  --ini /opt/Crm_Project/uwsgi.ini
stopasgroup=true
killasgroup=true

    5.测试用supervisor启动uwsgi ,注意要确保此时uwsgi已经退出
    5.测试用supervisor启动uwsgi ,注意要确保此时uwsgi已经退出
    5.测试用supervisor启动uwsgi ,注意要确保此时uwsgi已经退出
    5.测试用supervisor启动uwsgi ,注意要确保此时uwsgi已经退出
    
supervisord -c  /etc/supervisor.conf   #这是启动supervisor服务端命令

supervisorctl -c /etc/supervisor.conf     #这是supervisor客户端管理命令

    6.学习supervisor的命令
    
    status s18crm #查看状态
    start s18crm  #启动任务
    stop  s18crm #停止任务
    
    start all  
    stop  all  #启停所有的任务
    
   

参考文档:http://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html

 uwsgi热加载:https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Management.html

原文地址:https://www.cnblogs.com/16795079a/p/10645512.html