美文网首页
Mac本地Django+Nginx+Gunicorn 部署总结

Mac本地Django+Nginx+Gunicorn 部署总结

作者: KingLionsFrank | 来源:发表于2020-03-04 18:03 被阅读0次

    前言:

    本文主要记录笔者第一次尝试在 MacOS 上对Django+Gunicorn+Nginx进行部署的遇到的一些问题与感受

    链接:

    Django: https://docs.djangoproject.com/en/2.0/
    Nginx:http://nginx.org/en/docs/
    Gunicorn:http://gunicorn.readthedocs.io/en/latest/

    摘要:

    1、Django项目配置说明

    前提是已经拥有一个完整的 Django 工程项目,工程结构如下:

    工程结构.png
    然后就是对 Django 工程的settings.py文件一些内容修改:

    (1)DEBUG修改为 False
    在Django项目中,DEBUG是为了方便开发者进行调试工程模式,当值为 True 时,运行系统会默认加载静态资源文件,所以关闭 调试模式之后,才可以使用 nginx 服务器代理加载静态文件
    (2)ALLOW_HOSTS中加入域名或者服务器 ip
    例如 ALLOWED_HOSTS = ['127.0.0.1','example.com']
    (3)设置STAIC_ROOT
    STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static') 或者指定的文件路径
    (4)执行python3 manager.py collectstatic
    作用是将工程中的所有静态文件(image、js、css)都都收集到 STATIC_ROOT 指定的文件中,便于后续 nginx 是配置

    2、Gunicorn配置说明

    Gunicorn详细配置说明博客: https://www.cnblogs.com/nanrou/p/7026789.html

    gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源于Rubyunicorn项目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被称为arbiter),能够与各种wsgi web框架协作
    (1)执行pip install gunicorn安装
    (2)在Django工程settings.py文件的INSTALLED_APPS配置中加入gunicornapp
    (3)进入工程文件,执行gunicorn 工程名.wsgi 来快速启动gunicorn 服务器
    (4)另外也可以通过创建配置gunicorn.conf.py来实现,配置内容如下:

    import multiprocessing
    
    bind = "127.0.0.1:8000"   #绑定的ip与端口
    workers = multiprocessing.cpu_count() * 2 + 1    #进程数
    errorlog = '/Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/gunicorn.error.log' #发生错误时log的路径
    # accesslog = '/home/xxx/xxx/gunicorn.access.log' #正常时的log路径
    proc_name = 'gunicorn_TTSXProject'   #进程名
    timeout = 30      #超时
    threads = 2 #指定每个进程开启的线程数
    
    

    (5)启动:gunicorn 工程名.wsgi:application -c 文件路径/gunicorn.conf.py 或者在工程目录下执行gunicorn 工程名.wsgi:application -c gunicorn.conf.py
    (6)关闭gunicorn:
    lsof -i:pid进程ID:查询到使用中的端口
    kill -9 pid进程ID:释放端口
    kill -HUP pid进程ID:重启任务

    3、Nginx配置说明

    (1)安装
    brew update //结果:Already up-to-date.
    brew install nginx
    (2)路径
    mac 上的配置路径为:/usr/local/etc/nginx/nginx.conf
    mac 上的安装路径为:/usr/local/Cellar/nginx
    (3)启动
    nginx:启动 nginx 服务器
    nginx -s reload:重启 nginx 服务器
    pkill -9 nginx :彻底关闭 nginx 服务器
    nginx -s stop:关闭服务器
    默认启动8080端口,所以nginx服务器启动之后在浏览器上访问127.0.0.1:8080进入nginx欢迎界面
    (4)配置django 工程nginx关联文件
    可以直接在django项目中创建一个nginx.conf文件,添加如下内容:

    server {
            # nginx 监听的端口
            listen       80;
    
            #服务器 ip 域名
            server_name  127.0.0.1 example.com;
            #指定配置 log 文件路径
            access_log   /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/nginx.access.log;
            error_log   /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/conf_msg/nginx.error.log;
    
            location / {
    
                    # nginx 代理指向地址,即访问 8000 端口时,直接交给 gunicorn 处理
                    # django 中的静态文件也属于 8000 端口访问
                   
                   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;
            }
    
            # 访问一些其他静态文件,直接交给 nginx 处理,
            # 可以指向 django 项目中配置的 STATIC_ROOT 路径
            # alias :直接查询指定路径
            # root :会在指定路径后面添加上  static/
            location /static/  {
    
                    alias /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/collect_static/;
            }
    
        location /media/  {
                    alias /Users/frank/Desktop/pythonDemo/tb_Django/TTSXProject/collect_static/upload/;
    
                    # 缓存时间
                    expires 30d;
            }
    
    }
    

    (5)关联配置文件
    sudo ln -s 项目路径/nginx.conf /usr/local/etc/nginx/servers/定义名字.conf
    此时在/usr/local/etc/nginx/servers/目录下会发现关联的 项目配置文件,同时可以再次启动nginx服务器

    4、访问项目

    nginxgunicorn服务器都启动成功之后,可以在浏览器中访问定义的API,例如nginxserver中配置的反向代理是127.0.0.1,监听端口是80,则直接访问127.0.0.1即可
    ----------------------------------------------------------------------------------------------------
    分割线------分割线------分割线------分割线
    ----------------------------------------------------------------------------------------------------

    5、配置过程中遇到的问题

    (1)PermissionError(13, 'Permission denied')
    当输入终端命令时,提示这个错误,证明是命令权限错误,
    解决方法:需要在执行的命令前加上sudo

    (2)通过 nginx 访问出现 403 Forbidden errors
    当通过nginx访问一些静态文件资源时报错 403,原因可能有两个
    a、配置权限不够
    解决方案:在 nginx.conf 中修改 nginx 启动用户,即user 用户名 wheel
    b、目录索引设置错误
    解决方案:查找检测文件索引配置并更正索引

    注意:

    当通过 nginx 访问时,一直无法加载静态文件,并返回403,证明是第一种情况
    (3)ajax访问请求出现[No 'Access-Control-Allow-Origin' header is present on the requested resource.'](http://blog.csdn.net/zhoucheng05_13/article/details/53580683)
    这是当前使用 Ajax访问出现了跨域请求错误,需要在服务的进行添加响应头配置
    解决方案:

    # 在`view.py`中的响应方法中添加
        response = HttpResponse(json.dumps(context), content_type="application/json")
    
        # 解决 ajax 跨域请求问题
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"
        response["Access-Control-Max-Age"] = "1000"
        response["Access-Control-Allow-Headers"] = "*"
    

    (4)当Django项目设置为DEBUG=False时,访问报错:Bad Request (400)
    此时可能是因为ALLOWED_HOSTS的设置出现问题,导致访问出错
    解决方案:将ALLOWED_HOSTS进行如下设置:
    ALLOWED_HOSTS = ['*']

    相关文章

      网友评论

          本文标题:Mac本地Django+Nginx+Gunicorn 部署总结

          本文链接:https://www.haomeiwen.com/subject/alrrfftx.html