• nginx+gunicorn部署Django项目


    实际采用的nginx.conf文件内容:

    server {
        charset utf-8;
        listen 80;
        server_name ip;
    
        access_log /webapps/project/logs/nginx.access.log;
        error_log /webapps/project/logs/nginx.error.log;
    
        location = /favicon.ico { access_log off; log_not_found off; }
        location /static {
            alias /webapps/project/myproject/static/; # 项目静态文件所在路径
        }
        location /media {
            alias /webapps/project/myproject/media/;
        }
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    管理gunicorn脚本内容:

    bash manage.sh start|stop|restart
    
    # cat manage.sh
    function start(){
    	VIRTUALENV_DIR=自己虚拟环境路径
    	source ${VIRTUALENV_DIR}/bin/activate
    	DJANGO_DIR=自己项目地址路径
    	cd ${DJANGO_DIR}
    	gunicorn xxxx.wsgi:application 
    	--bind 127.0.0.1:8000 
    	--workers 4 
    	--timeout 30 
    	--daemon 
    	--reload 
    	--access-logfile 自己日志地址 
    	--error-logfile 自己日志地址
    }
    
    function stop(){
        kill -9 `ps -ef |grep gunicorn|grep -v grep|awk "NR==1" |awk '{print $2}'`
    }
    
    case $1 in
    "start")
    start
    sleep 5
    echo "启动完成"
    ;;
    "stop")
    stop
    sleep 5
    echo "关闭成功"
    ;;
    "restart")
    stop
    echo "关闭等到5秒"
    sleep 5
    echo "正在启动中,等待10秒"
    sleep 10
    start
    echo "重启完成"
    ;;
    *)
    echo "only start|stop|restart"
    exit 1
    ;;
    esac
    

    Django 项目中的 settings.py 部分重要配置

    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = False
    
    # 允许访问此项目的地址
    ALLOWED_HOSTS = ['*']  # 其实只添加你的IP地址或域名即可
    
    # Application definition
    INSTALLED_APPS = [
        ...
        # 'gunicorn', # gunicorn采用gevent 模式需要开启这个
    ]
    
    # Database
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db_qc',
            'HOST': '172.17.0.1',
            'PORT': '3306',
            'USER': 'root',
            'PASSWORD': '123456',
            'CHARSET': 'utf8',
        }
    }
    
    # Static files (CSS, JavaScript, Images)
    # # 对外提供WEB访问时的URL地址
    STATIC_URL = '/static/'
    # # 然后会将项目中的静态文件(包括STATICFILES_DIRS、自带admin的静态文件)收集到该目录下面来(所以不应该在该目录下面放置自己的一些静态文件,因为会覆盖掉)
    STATIC_ROOT = os.path.join(BASE_DIR, "static")
    
    # Upload source
    # # 对外提供WEB访问时的URL地址
    MEDIA_URL = '/media/'
    # # 放置项目接收的上传文件
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    

    创建虚拟独立环境

    # 创建虚拟环境
    $ virtualenv --python /usr/local/bin/python3.6 py-env-boluomi
    # 进入虚拟环境
    $ source py-env-boluomi/bin/activate
    # 退出依赖环境
    (py-env-boluomi)$ deactivate
    

    安装依赖包

    # 在虚拟环境中安装django
    (py-env-boluomi)$ pip install django
    # 在虚拟环境中安装mysqlclient
    (py-env-boluomi)$ pip install mysqlclient
    # 在虚拟环境中安装gunicorn
    (py-env-boluomi)$ pip install gunicorn
    

    创建Django项目

    # 在项目目录创建Django项目
    (py-env-boluomi)$ django-admin startproject boluomi
    

    项目目录结构如下:

    boluomi
    ├── boluomi
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py
    

    编辑settings.py文件,将数据库改为MySQL:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'boluomi',
            'USER': 'root',
            'PASSWORD': '123456',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'OPTIONS': {
                'init_command':"SET sql_mode='STRICT_TRANS_TABLES'",
            },
        }
    }
    

    根据模型将数据表同步到数据库:

    (py-env-boluomi)$ python manage.py migrate 
    

    根据提示创建一个admin的管理账户:

    (py-env-boluomi)$ python manage.py createsuperuser
    

    启动Django内置服务器:

    (py-env-boluomi)$ python manage.py runserver 0.0.0.0:8080
    

    配置Gunicorn

    在实际生产环境中不会使用Django内置的单线程开发服务器,可以采用Gunicorn,Gunicorn是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器。
    Gunicorn采用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。

    # 使用方法
    # gunicorn [OPTIONS] 模块名:变量名
    # 模块名是python文件名(可以是完整的路径+python文件名)
    # 变量名是python文件中可调用的WSGI(Web Server Gateway)
    
    # [OPTIONS]
    # 指定一个配置文件
    # -c CONFIG, --config
    
    # 绑定socket
    # -b ADDRESS, --bind ADDRESS
    
    # 以守护进程方式运行Gunicorn进程
    # -D, --daemon
    
    # 切换到指定的工作目录
    # --chdir CHDIR
    
    # 工作进程的数量,在Gunicorn启动的时候,在主进程中预先fork出指定数量的worker进程处理请求
    # -w INT, --workers INT
    
    # worker重启前处理的最大请求数
    # --max-requests INT
    
    # worker空闲的超时时间,空闲超时将重启(默认30秒)
    # -t INT, --timeout INT
    
    # 指定访问日志文件
    # --access-logfile FILE
    
    # 指定error log的错误级别
    # --log-level LEVEL
    
    # 指定错误日志文件
    # --error-logfile FILE, --log-file FILE
    

    启动/关闭/重启Gunicorn:

    # 启动Gunicorn
    (py-env-boluomi)$ gunicorn boluomi.wsgi:application --bind 0.0.0.0:8080 --workers 2
    # 关闭Gunicorn
    $ pstree | grep gunicorn | grep -v grep | awk 'NR==1{system("kill -QUIT "$2)}'
    # 重启Gunicorn
    $ pstree | grep gunicorn | grep -v grep | awk 'NR>1{system("kill -HUP "$2)}'
    

    在生产环境使用Gunicorn需要添加很多配置,通常我们会把这些配置写成一个bash脚本,如下所示:

    #!/bin/bash
    # 激活虚拟环境
    VIRTUALENV_DIR=/data/server/workspace/py-project/py-env-boluomi
    source $VIRTUALENV_DIR/bin/activate
    #进入项目目录
    DJANGO_DIR=/data/server/workspace/py-project/boluomi
    cd $DJANGO_DIR
    #启动Gunicorn服务
    gunicorn boluomi.wsgi:application 
    --bind 0.0.0.0:8080 
    --workers 2 
    --timeout 30 
    --daemon 
    --access-logfile /data/logs/gunicorn/boluomi_access.log 
    --error-logfile /data/logs/gunicorn/boluomi_error.log
    

    用Gunicorn启动服务后,Django的admin无法显示static文件,解决方法如下:

    在项目的settings.py中设置ALLOWED_HOSTS:

    # 这个参数的设置是为了限制一些主机的访问,当Debug=False的时候,这个值是必须要设定的,否则会报错。
    # 其值是一个列表,可以是ip地址,也可以是域名,还可以支持通配符。
    ALLOWED_HOSTS = ['*']
    

    在项目的settings.py中添加STATIC_ROOT:

    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    

    执行如下命令会自动创建static文件夹,并把静态文件全部复制到static文件夹中:

    $ python manage.py collectstatic 
    

    在项目urls.py中添加如下内容:

    from django.conf import settings
    from django.conf.urls import url
    from django.views.static import serve
    
    # DEBUG为Fasle时执行
    if not settings.DEBUG:
        urlpatterns += [url(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT})]
    

    配置Nginx

    通常Gunicorn会部署在Nginx后面,Nginx会直接解析静态请求,并将动态请求转发给Gunicorn去解析。

    server {
        listen       80;
        server_name  boluomi.test.com;
        
        access_log   /data/logs/nginx/boluomi_access.log  main;
        error_log    /data/logs/nginx/boluomi_error.log;
        
        location / {
        	proxy_pass http://127.0.0.1:8080;
        	proxy_set_header Host $host;
        	proxy_set_header X-Real-IP $remote_addr;
        	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        
        location /static {
        	alias /data/server/workspace/py-project/boluomi/static;
        }
    }
    
    
  • 相关阅读:
    ios webapp调试神器MIHTool
    20个正则表达式
    jQuery技巧
    浏览器判断和移动端的判断
    JavaScript 被忽视的细节
    移动端Web页面问题解决方案
    virtualenv创建虚拟环境
    init.d文件夹
    python連接mysql數據庫
    const和define的使用区别
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/13728997.html
Copyright © 2020-2023  润新知