记录下这个大坑
以往我的https都是歪门邪道,我用着nginx的ssl证书,然后用django-sslserver直接引用nginx的证书,最后再用nginx监听80端口做重定向给django-sslserver的443。
这么做看似没有问题,但是socket总是报莫名其妙的错误,而且runsslserver毕竟也算是开发环境,生产环境中这样用也是不合适的。所以今天用上了正规的nginx+uwsgi+https,但是呢道阻且长,下面简单记录下步骤吧,防止自己遗忘。
首先ssl证书的获取:
在创建证书之前,我们需要确保 Web 服务器可以在根目录下的该路径下提供静态文件:/.well-know
。由于django 应用程序引入的所有路径都通过 wsgi 提供服务,因此我们需要编写nginx 配置以便于静态地提供这些资源:将以下内容添加到域名的 nginx 配置文件中:
server {
location /.well-known/acme-challenge {
alias /path/to/yoursite/.well-known/acme-challenge;
}
}
请根据自己的情况修改 /path/to/yoursite/
字段,比如 改成/home/User/aifuture.site
,这个路径便是 Django app 的绝对路径,即 manage.py
文件所在目录。
从 github 上面下载源码,可以不用管 Linux 服务器发行版的区别:
git clone https://github.com/certbot/certbot.git
因为我们是 nginx 而不是 Apache,所以使用 webroot
选项获取证书:
certbot certonly --webroot -d aifuture.site -d www.aifuture.site
请修改 /path/to/yoursite
字段,和上面预先工作的修改一样,然后后面的aifuture.site 和 www.aifuture.site
请修改成自己的域名,如果现在的域名不能加 www 访问的话(即没有提供 WWW 的解析),请去掉最后这条字段。
这条命令成功的输出类似于这样(有Congratulations):
Output:
IMPORTANT NOTES:
If you lose your account credentials, you can recover through
e-mails sent to sammy@digitalocean.comCongratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2018-08-31. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.If like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
上述命令会为aifuture.site和www.aifuture.site生成一个单独的证书。证书存储于 /etc/letsencrypt/live/
aifuture.site/fullchain.pem
.
参考官方链接:
https://docs.djangoproject.com/en/1.10/topics/security/#ssl-https
修改配置文件setting.py
,将以下行加入进去:
SESSION_COOKIE_SECURE=True
SESSION_COOKIE_HTTPONLY=True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
Let’s Encrypt 的证书90天就过期了,所以,我们还需要设置自动化更新脚本,最容易的莫过于使用 crontab
了。使用 crontab -e
命令加入如下的定时作业(每周都强制更新一下,如果需要 root 权限,需要切换到 root 下执行):
45 2 * * 2 cd /etc/letsencrypt/ && ./certbot-auto renew --deploy-hook "service nginx reload"
crontab 六个字段含义:
minute hour day month week command
其中:
如果字段使用 * 号,如 month 字段为 * 号,则为满足其他字段约束的每月都执行该命令。
这里是每周 2 的 2 点 45 分尝试更新证书,如果证书在 30 天内到期,则会更新证书,否则不会更新, --deploy-hook
选项表示在更新成功以后才运行重载 nginx 的命令。
证书搞定了,那么如何使用呢?
django的开发就不讲了,下面从uwsgi开始,在manage.py同级目录下创建一个uwsgi的ini文件,名字可以随意,但是路径不能随意,不然又是莫名其妙的import错误,前端反映的就全都是nginx的404。ini文件内容:
[uwsgi]
socket=:随意一个端口,如(1234)
module=web.wsgi
master=True
processes=2
vacuum=true
daemonize=wsgi.log
然后命令行:
uwsgi --ini uwsgi.ini
这就算是服务启动了,下面还要建立和nginx之间的scoket管道,nginx的default server配置如下:
server{
listen 80;
rewrite ^(.*)$ https://www.aifuture.site$1;
}
server{
listen 443;
server_name www.aifuture.site;
ssl on;
ssl_certificate /etc/letsencrypt/live/www.aifuture.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.aifuture.site/privkey.pem;
ssl_session_timeout 3m;
location /templates/{
alias /root/文档/1/web_app/templates;
}
location /static {
alias /root/文档/1/web_app/static;
}
location /media {
alias /root/文档/1/web_app/media;
}
location /{
uwsgi_pass uwsgi地址,如(127.0.0.1:1234);
include /etc/nginx/uwsgi_params;
}
}
内容就不翻译了,里面就是配置了http转https,然后ssl证书路径,然后static,media,templates路径,然后其他的请求转交给uwsgi的地址.
然后还有一个坑,要把nginx.conf里的user 换成root,不然有可能访问权限不够。全给你一堆403错误
还没完呢,还有一个坑,admin界面的静态文件,要收集一下,参见这篇博客
https://blog.csdn.net/qq_42571805/article/details/80862455
搞完这些,就算是正规部署了太累了,坑真多
期望这下我不会再遇到django-sslserver那些莫名其妙的坑了
              没有登录的话是不能使用评论功能的哈。 去登录 去注册