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