环境说明
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
31upstream 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 nginx
和systemctl start nginx
,这样启动NGINX并且保证开机自启动NGINX。
此时如果你已经绑定好了域名,那么在浏览器里就能正常的通过https://域名
的方式访问Django了,如图:
解决跨域问题
虽然上面已经用uwsgi+NGINX实现了Django的稳定而持续的展示,但是如果有跨域来访问是会报错的,如图:
那么就需要把几个相信的域名添加到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
20INSTALLED_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
5location / {
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/