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

前言:

本文主要记录笔者第一次尝试在 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 部署总结)