Nginx+SSL+gunicorn+gevent+Django的配置
一、环境
- 服务器: 阿里云轻量应用服务器
- 系统: Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-90-generic x86_64)
- 配置:
- vCPU: 2核
- 内存: 2GB
- ESSD: 60GB
二、前提
1. 安装Nginx
1.1. 在Nginx官网下载 Stable version
1.2. 在安装包路径上使用 ./configure
命令安装Nginx, 可自行添加参数 (参考官方文档)
2. 安装gunicorn、gevent和Django
pip install gunicorn gevent django
3. 添加域名及HTTPS服务
3.1. 购买域名
3.2. 服务器设置
从轻量应用服务器管理控制台进入服务器管理页
-
添加域名
-
添加防火墙规则
3.3. 添加SSL证书
-
选购SSL证书
-
在SSL证书管理控制台创建证书并申请
3.4. 域名解析
-
在域名控制台点击解析
-
添加如下记录
3.5. 参考帮助文档在APP端进行ICP备案
三、配置
1. Nginx
1.1. 下载SSL证书到本地
SSL证书申请通过后, 在SSL证书管理控制台下载证书
1.2. 将证书放到指定位置
1.2.1. 执行以下命令, 在Nginx安装目录下创建一个用于存放证书的目录, 将其命名为cert
cd /usr/local/nginx/conf
mkdir cert
1.2.2. 将本地证书文件cert-file-name.pem
和私钥文件cert-file-name.key
放置到cert
目录
1.3. 修改nginx.conf
文件
cd /usr/local/nginx
vim conf/nginx.conf
nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
error_log /var/log/nginx/error.log warn;
#pid logs/nginx.pid;
events {
worker_connections 1024;
accept_mutex off; # set to 'on' if nginx worker_processes > 1
use epoll; # to enable for Linux 2.6+
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
access_log /var/log/nginx/access.log combined;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream app_server {
# fail_timeout=0 means we always retry an upstream even if it failed
# to return a good HTTP response
# for UNIX domain socket setups
server unix:/tmp/gunicorn.sock fail_timeout=0;
# for a TCP configuration
# server 192.168.0.7:8000 fail_timeout=0;
}
server {
# if no Host match, close the connection to prevent host spoofing
listen 80 default_server;
return 444;
}
# 以下属性中,以ssl开头的属性表示与证书配置有关。
server {
listen 443 ssl;
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
root html;
index index.html index.htm;
ssl_certificate cert/cert-file-name.pem; #需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate_key cert/cert-file-name.key; #需要将cert-file-name.key替换成已上传的证书私钥文件的名称。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
location / {
# checks for static file, if not found proxy to app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
proxy_pass http://127.0.0.1:8000;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
}
}
1.4. 重启Nginx服务
cd /usr/local/nginx/sbin
./nginx -s reload
2. Django
2.1. 创建项目
cd
到一个你想放置你代码的目录, 然后运行以下命令
django-admin startproject mysite
startproject
创建了以下目录和文件
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
2.2. 修改settings.py
文件
修改ALLOWED_HOSTS = {}
ALLOWED_HOSTS = [
'.yourdomain.com',
'localhost',
]
3. gunicorn和gevent
在manage.py
文件所在的目录中运行以下命令
gunicorn -k gevent mysite.wsgi