nginx+uWSGI+django+virtualenv+supervisor发布web服务器 2018-11-14

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

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

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

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

WSGI:好的,我在等着

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

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

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

一、首先创建一个虚拟环境

mkvirtualenv django22

二、在虚拟环境中安装django并创建项目

pip3 install django==1.11.15
创建一个项目
django-admin startproject mysite
在项目文件夹中创建app
python3 manage.py startapp app01
配置mysite/settings.py文件
ALLOWED_HOSTS = ['*']
注册app
配置mysite/urls.py

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
pip3 install uwsgi
检查uwsgi版本
uwsgi --version
检查uwsgi python版本
uwsgi --python-version

  • 运行简单的uWSGI
    • 建一个测试py文件
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
  • 启动一个python
    uwsgi --http :8000 --wsgi-file test.py
    • http :8000: 使用http协议,端口8000
    • wsgi-file test.py: 加载指定的文件,test.py
  • 运行django程序
    要在项目文件夹下运行
    uwsgi --http :8000 --module mysite.wsgi
    • module mysite.wsgi: 加载指定的wsgi模块
  • 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程序,页面生效
  • 指定配置文件启动命令
    在项目目录(与app同级目录)下创建一个uwsgi.ini文件
    写入如下内容
[uwsgi]
#使用nginx连接时使用
socket=0.0.0.0:9000
#不用nginx直接当做web服务器使用
#http=0.0.0.0:9000
#项目目录绝对路径
chdir=/root/Envs/django15/mysite15
#wsgi文件路径,在项目底下
wsgi-file=mysite15/wsgi.py
#指定解释器目录,就是创建虚拟环境的目录
home=/root/Envs/django15
processes=4
threads=2
master=True
pidfile=uwsgi.pid

通过配置文件启动项目命令
uwsgi --ini uwsgi所在目录绝对路径/uwsgi.ini

四、配置nginx支持转发uwsgi请求

在server上边设置负载均衡池

upstream ss {
    server 0.0.0.0:9000 weight=10;   # 启动django项目是通过9000端口启动
}

虚拟主机标签段,在这定义mytb.com

    server {
        listen       80;
        server_name  www.mytb.com;   # 代理域名,通过这个域名直接访问
        location / {
            include /opt/nginx1-12/conf/uwsgi_params; 
            uwsgi_pass  ss;   # 指定负载均衡池
            #root   /opt/static/mytb/;
            #index  index.html index.htm;
        }
        #nginx处理静态资源配置,首先要在项目目录下建一个static文件夹
        location /static  {
            alias /opt/static/django;
}

配置完启动nginx

五、配置django项目,收集静态文件

关闭debug模式
debug=False
收集静态文件的目录,静态文件内容都放这里了

STATIC_ROOT='/opt/static/django'   # 要与Nginx中配置路径一致
    STATIC_URL = '/static/'
    STATICFILES_DIRS=[
        os.path.join(BASE_DIR,"static"),
    ]

执行命令统一收集静态文件,使得网站正常加载js,css
python3 manage.py collectstatic

六、supervisor基于 python 的任务管理工具

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

安装supervisor

由于supervisor在python3下无法使用,因此只能用python2去下载
首先要退出虚拟环境,然后执行以下命令
yum install python-setuptools
easy_install supervisor
或者直接yum install supervisor也可以

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

echo_supervisord_conf > /etc/supervisord.conf

然后再/etc/supervisord.conf末尾添加上如下代码!!!!!!
[program:my_django15]
    command=/root/Envs/django22/bin/uwsgi --ini /data/mysite/uwsgi.ini
`
# 第一个路径是项目所在的虚拟环境的bin目录下的uwsgi --ini文件,
# 第二个路径是项目目录下的uwsgi.ini文件
最后启动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都不会自动重启。

你可能感兴趣的:(nginx+uWSGI+django+virtualenv+supervisor发布web服务器 2018-11-14)