Uwsgi+nginx运行Django并且解决跨域

环境说明

Django == 2.1.8
python == 3.6.4
Django project = naxx
Django App = naxxramas

配置uwsgi和NGINX

为啥要引入uwsgi?使用python manage.py runserver 来运行服务器。这只适用测试环境中使用。而uWSGI以客户端-服务端模式运行。Web 服务器(例如 nginx,Apache)与一个 django-uwsgi “worker” 进程交互,提供动态内容。

首先pip install uwsgi安装uwsgi,我这里安装的是2.0.18,然后来到django的项目根目录,即manage.py同级的文件夹里,编写一个叫naxx.ini的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[uwsgi]
chdir = /opt/naxx
master = True #主进程
processes = 4
threads = 2
socket = 127.0.0.1:8001 #这里指定Django是8001端口
# chmod-socket = 664
vacuum = true
wsgi-file = naxx/wsgi.py
pidfile = uwsgi.pid #PID文件
daemonize = uwsgi.log
#停止:uwsgi --stop uwsgi.pid
(venv)

然后uwsgi --ini naxx.ini启动uwsgi即可。

安装nginx很简单,我这里直接yum install -y nginx,首先去/etc/nginx里添加一个ssl文件夹,把你的HTTPS证书文件们都放进去。然后在/etc/nginx/conf.d里新创建一个naxx.conf,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
upstream django {
server 127.0.0.1:8001 # 这里跟naxx.ini的配置一样
}

server {
listen 8000;
listen 443 ssl; #这里配置了HTTPS
server_name 按实际写你的域名;
charset utf-8;

ssl_certificate ssl/你的HTTPS证书.crt;
ssl_certificate_key ssl/你的HTTPS证书.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
# max upload size
client_max_body_size 75M; # adjust to taste

# Django media

location /static {
alias /opt/naxx/static; # 这里是Django静态文件的地址,与Django的setting.py文件配置相同
}

# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /Django路径/uwsgi_params; # 这里是要填写Django的全路径
}
}

保存退出后,systemctl enable nginxsystemctl start nginx,这样启动NGINX并且保证开机自启动NGINX。

此时如果你已经绑定好了域名,那么在浏览器里就能正常的通过https://域名的方式访问Django了,如图:
akb48

解决跨域问题

虽然上面已经用uwsgi+NGINX实现了Django的稳定而持续的展示,但是如果有跨域来访问是会报错的,如图:
akb48

那么就需要把几个相信的域名添加到cros跨域白名单里。

首先先pip install django-cors-headers,我这里安装的版本是3.3.0。然后编辑Django project下的settings.py文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
INSTALLED_APPS = [
···
'corsheaders', #这个最好加在中间
···
]

CORS_ORIGIN_WHITELIST = [
'https://cors白名单域名',
'https://cors白名单域名'
···
]

# CORS_ORIGIN_ALLOW_ALL = True #如果希望所有人都来访问,就放开这个

MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]

重启uwsgi,让目标的域名来访问,如果此时出现了“The value of the ‘Access-Control-Allow-Credentials’ header in the response is ‘’ which must be ‘true’ when the request’s credentials mode is ‘include’”的话,那么需要在naxx.conf里添加如下的配置:

1
2
3
4
5
location / {
uwsgi_pass django;
include /opt/naxx/uwsgi_params; # the uwsgi_params file you installed
add_header 'Access-Control-Allow-Credentials' 'true'; #这句话
}

sudo nginx -s reload一下,就可以解决问题了!

参考资料

https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
https://pypi.org/project/django-cors-headers/
https://www.hi-linux.com/posts/60405.html
https://docs.djangoproject.com/zh-hans/2.2/howto/deployment/wsgi/uwsgi/

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------