• nginx+uwsgi+django+virtualenv+supervisor发布web服务器


    1.uWSGI命令学习与使用

    1.1使用uWSGI启动图书管理系统项目,支持多进程

    1.2使用pip安装uwsgi模块

    pip3 install uwsgi
    

    1.3uwsgi的hello world测试

    1.3.1创建文件vim /opt/testuwsgi.py 写入以下内容

    cd /opt/
    vim wsgitest.py
    # 写入下面内容
    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return [b"Hello World"]
    

    1.3.2使用uwsgi命令启动此文件

    uwsgi --http :9000 --file testuwsgi.py
    

    在浏览器通过IP加端口进行访问

    http://你自己服务器的ip:9000/
    即可看到浏览器上打印的内容
    

    1.4配置uwsgi.ini文件

    在django项目根目录下(manage.py同级目录)创建这个文件

    [uwsgi]
    #使用nginx连接时使用,Django程序所在服务器地址
    # socket=0.0.0.0:9000
    #直接做web服务器使用,Django程序所在服务器地址
    http=0.0.0.0:9000
    #项目目录
    chdir=/opt/django_zuoye2
    #项目中wsgi.py文件的目录,相对路径,相对于上面的项目目录
    wsgi-file=django_zuoye2/wsgi.py
    # 进程数
    processes=1
    # 线程数
    threads=2
    # uwsgi服务器的角色
    master=True
    # 存放进程编号的文件
    pidfile=uwsgi.pid
    # 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
    # 如果启用了supervisor工具,就将此行注释
    daemonize=uwsgi.log
    # 指定依赖的虚拟环境
    virtualenv=/root/Envs/book_manage_env
    

    注意: 目前暂时先用http,如果使用nginx的话,就需要注释掉http,启用socket

    1.5使用uwsgi命令启动django程序

    uwsgi --ini /opt/django_zuoye2/uwsgi.ini
    

    前端访问:http://你自己服务器的ip:9000/book_list/

    会发现没有样式,因为uwsgi不能处理静态文件,下面我们就需要用到nginx

    1.6 uwsgi启动后无法访问的问题解决

    修改项目里面的wsgi.py文件,将settings的配置指向dev.py

    vim /opt/django_zuoye2/django_zuoye2/wsgi.py
    
    

    修改配置文件

    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_zuoye2.settings')
    

    1.7uwsgi不能处理静态文件

    wsgi本身是支持高并发,多进程的功能,这是它的优点
    
    缺点:  不能处理静态文件
    

    1.8收集django的静态文件

    由于uwsgi对静态文件的处理很差,然而nginx处理静态文件是一把手,所以我们的项目部署还需要结合nginx来使用

    1.8.1设置django的静态文件目录并收集, 打开mysite/settings.py, 加入这一项配置

    STATIC_ROOT='/opt/django_zuoye2/static'  # 在STATIC_URL = '/static/'配置上面加这一行
    STATIC_URL = '/static/'
    STATICFILES_DIRS=[
        os.path.join(BASE_DIR,"static"),
    ]
    

    那么,上述的参数STATIC_ROOT用在哪?看下面

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

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

    1.8.3查看django的静态文件收集目录

    ls /opt/django_zuoye2/static
    

    1.9完成nginx的安装并配置nginx

    1.安装nginx需要的依赖库yum install -y gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
    
    
    1.下载源码包
    wget -c https://nginx.org/download/nginx-1.16.0.tar.gz
    2.解压缩源码
    tar -zxvf nginx-1.16.0.tar.gz
    3.配置,编译安装  开启nginx状态监测功能
    cd /opt/nginx-1.16.0/
    ./configure --prefix=/opt/nginx116/ --with-http_ssl_module --with-http_stub_status_module 
    make && make install 
    

    1.9.1nginx.conf配置文件详情

    配置之前,需要将项目目录下的uwsgi.ini中的文件socket注释释放出来,同时将http注释掉

    socket=0.0.0.0:9000
    #http=0.0.0.0:9000
    

    启动

    uwsgi uwsgi.ini
    

    修改 /opt/nginx116/conf/nginx.conf文件

    server {
        listen       80;
        server_name  192.168.222.127; #目前在本地,后续有域名直接换成你自己的域名即可
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
    
        location / {
            include uwsgi_params;
            uwsgi_pass 0.0.0.0:9000;
        }
        location /static {
            root   /opt/django_zuoye2;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    

    虚拟主机: 用于接受用户发起的80端口的请求,反向代理转发给9000的uwsgi应用, 同时处理后端的静态文件static

    2测试uwsgi与nginx

    测试手动启动uwsgi与nginx,能够保证正常访问即可

    2.1

    cd /opt/django_zuoye2/
    uwsgi uwsgi.ini
    

    2.2平滑重启nginx

    /opt/nginx116/sbin/nginx -s reload
    

    2.2项目访问不了的解决思路

    1 先关闭nginx, 再关闭uwsgi,直接使用python manage.py runserver命令启动django项目
    2 关闭刚才启动的django,使用uwsgi将项目跑起来, 使用9000端口访问,确认是否正常
    3 注释掉uwsgi配置文件中的http,启用socket,再启动uwsgi,再启动nginx,再进行访问
    

    3.supervisor工具的安装与使用

    3.1supervisor的概念

    官网文档http://supervisord.org/installing.html

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

    3.2安装

    easy_install supervisor   # 这个是python2下面的安装模块命令
    pip install Supervisor    #python3安装
    如果easy_install命令无法使用的话,就安装一下python-setuptools工具即可
    yum install python-setuptools
    

    3.3使用命令生成supervisor配置文件

    echo_supervisord_conf > /etc/supervisord.conf
    

    3.4修改配置文件/etc/supervisord.conf

    在文件末尾添加如下配置:

    [program:book_manage]  # 名字随便起
    command=/root/Envs/book_manage_env/bin/uwsgi /opt/django_zuoye2/uwsgi.ini
    stopasgroup=true
    killasgroup=true
    # 如果发现关闭supervisor进程后,结束uwsgi进程无效,就需要加上这两个参数
    

    3.5启动supervisor工具

    supervisord -c /etc/supervisord.conf
    

    3.6查看supervisor的状态

    supervisorctl
    如果是FATAL说明没有启动
    需要输入命令
    start django_zuoye2   # 当前只有一个,指定名称就行
    


    启动后报错,原因是uwsgi是后台启动,所以我们需要把后台配置的启动关掉

    cd /opt/django_zuoye2/
    vim uwsgi.ini
    #daemonize=uwsgi.log  将这行代码注释掉
    

    此时我们再查看下uwsgi的状态,确定了没有启动,我们再来启动supervisor

    ps -ef | grep uwsgi
    supervisorctl  #进入supervisor
    start all # 启动
    
    当然也可以直接不进入在外面直接使用命令
    supervisorctl stop all #停止
    supervisorctl start all #开启
    
    # 此时再查看下uwsgi的进程,确定是运行起来了
    ps -ef | grep uwsgi
    
    # 测试一下,杀死uwsgi的进程,kill -9 pid,无论你杀多少次,都仍然还会自动在后台启动,说明就是没有问题啦
    
    # 再去浏览器访问,发现仍然是可以访问的,说明就没有问题了。
    

    supervisor交互模式中基本操作命令

    start 进程名   # 启动进程
    stop 进程名    # 停止进程
    start all     # 启动所有进程
    stop all      # 启动所有进程
    

    3.7 supervisor启动命令参数

    # 任务管理命令如下:有两种,一个是参数形式, 一个是交互式
    # 方式1参数形式  
    supervisord -c /etc/supervisor.conf stop/start/restart all
    supervisord -c /etc/supervisor.conf start qishi8
    
    # 方式2交互式形式
    supervisord -c /etc/supervisor.conf 
    #进入后启动
    start all
    

    3.8重新加载supervisor(了解即可)

    一、添加好配置文件后
    
    二、更新新的配置到supervisord    
    
    supervisorctl update
    三、重新启动配置中的所有程序
    
    supervisorctl reload
    四、启动某个进程(program_name=你配置中写的程序名称)
    
    supervisorctl start program_name
    五、查看正在守候的进程
    
    supervisorctl
    六、停止某一进程 (program_name=你配置中写的程序名称)
    
    supervisorctl stop program_name
    七、重启某一进程 (program_name=你配置中写的程序名称)
    
    supervisorctl restart program_name
    八、停止全部进程
    
    supervisorctl stop all
    注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。
    

    -------------------------------------------

    个性签名:代码过万,键盘敲烂!!!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    更新 箫心病毒分析专家2006 build 5.23(C#2.0)
    SOA也是一种设计模式
    SOA在美国和中国的差异
    单服务器配置部署Visual Studio 2005 Team Foundation Server步骤
    无废话ExtJs 入门教程十六[页面布局:Layout]
    无废话ExtJs 入门教程七[登陆窗体Demo:Login]
    无废话ExtJs 入门教程十八[树:TreePanel]
    无废话ExtJs 入门教程十一[下拉列表:Combobox]
    无废话ExtJs 入门教程十[单选组:RadioGroup、复选组:CheckBoxGroup]
    无废话ExtJs 入门教程八[脚本调试Firefox:firebug]
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/13912473.html
Copyright © 2020-2023  润新知