Python Tornado 建站流程:使用 Let’s Encrypt + Nginx 开启 HTTPS,结合 GitHub Webhook 实现自动部署。
1. Let’s Encrypt
需要开放 443 端口:
Python
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly -d pyhub.cc -d www.pyhub.cc
1
2
3
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly -d pyhub.cc -d www.pyhub.cc
2. Nginx
Python
# 重定向 HTTP
server {
listen 80;
server_name www.pyhub.cc pyhub.cc;
rewrite ^(.*)$ https://$host$1 permanent;
}
# Tornado proxy
upstream pycc{
server 127.0.0.1:8080;
}
server {
listen 443;
server_name pyhub.cc www.pyhub.cc;
ssl on;
ssl_certificate /etc/letsencrypt/live/pyhub.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pyhub.cc/privkey.pem;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://pycc;
}
}
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
# 重定向 HTTP
server {
listen 80;
server_name www.pyhub.cc pyhub.cc;
rewrite ^(.*)$ https://$host$1 permanent;
}
# Tornado proxy
upstream pycc{
server 127.0.0.1:8080;
}
server {
listen 443;
server_name pyhub.cc www.pyhub.cc;
ssl on;
ssl_certificate /etc/letsencrypt/live/pyhub.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pyhub.cc/privkey.pem;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://pycc;
}
}
Tornado
Python
def main():
# 设定 xheaders = True
http_server = tornado.httpserver.HTTPServer(Application(), xheaders=True)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()
1
2
3
4
5
6
7
8
def main():
# 设定 xheaders = True
http_server = tornado.httpserver.HTTPServer(Application(), xheaders=True)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()
优化ssl配置
参考:Guide to Deploying Diffie-Hellman for TLS
执行:
Python
openssl dhparam -out dhparams.pem 2048
1
openssl dhparam -out dhparams.pem 2048
经过相当长一段时间后生成 dhparams.pem,修改 Nginx 配置:
Python
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-EC
DSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES1
28-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_dhparam /etc/nginx/conf.d/dhparams.pem;
ssl_certificate /etc/letsencrypt/live/pyhub.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pyhub.cc/privkey.pem;
1
2
3
4
5
6
7
8
9
10
11
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-EC
DSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES1
28-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_dhparam /etc/nginx/conf.d/dhparams.pem;
ssl_certificate /etc/letsencrypt/live/pyhub.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pyhub.cc/privkey.pem;
自动更新
官方给出了自动更新证书的脚本 https_renew.sh:
Python
#!/bin/sh
nginx -s stop # or whatever your webserver is
/opt/letsencrypt/letsencrypt-auto renew -nvv --standalone --force-renewal > /var/log/letsencrypt/renew.log 2>&1
LE_STATUS=$?
nginx # or whatever your webserver is
if [ "$LE_STATUS" != 0 ]; then
echo Automated renewal failed:
cat /var/log/letsencrypt/renew.log
exit 1
fi
1
2
3
4
5
6
7
8
9
10
#!/bin/sh
nginx -s stop # or whatever your webserver is
/opt/letsencrypt/letsencrypt-auto renew -nvv --standalone --force-renewal > /var/log/letsencrypt/renew.log 2>&1
LE_STATUS=$?
nginx # or whatever your webserver is
if [ "$LE_STATUS" != 0 ]; then
echo Automated renewal failed:
cat /var/log/letsencrypt/renew.log
exit 1
fi
加入 crontab:
Python
crontab -u root -e
* * */90 * * /path/to/https_renew.sh
1
2
crontab -u root -e
* * */90 * * /path/to/https_renew.sh
2016-04-16 3 44 21
注意
页面中采用 http 的 CDN 服务会导致(Chrome)如下警告:
1 pic
One More Thing…
GitHub Webhook:
添加 Webhook 并监听 Push 事件,推送到服务器之后可以自动执行 git pull:
Python
# Application 设置开启 autoreload=True
class WebHookHandler(BaseHandler):
def post(self, *args, **kwargs):
if self.request.headers.get('X-GitHub-Event') == 'push':
print("Execute git pull github master")
subprocess.call("git pull github master", shell=True)
1
2
3
4
5
6
7
# Application 设置开启 autoreload=True
class WebHookHandler(BaseHandler):
def post(self, *args, **kwargs):
if self.request.headers.get('X-GitHub-Event') == 'push':
print("Execute git pull github master")
subprocess.call("git pull github master", shell=True)
相关推荐
在IT行业中,尤其是在Web服务器和应用服务器领域,SSL(Secure Sockets Layer)和其后续版本TLS(Transport Layer Security)是确保数据传输安全的关键技术。Tomcat作为一款流行的Java应用服务器,支持SSL配置以实现...
MySQL 使用SSL连接配置详解 在现代数据库管理中,安全性是至关重要的,SSL(Secure Sockets Layer)连接为MySQL提供了一种加密数据传输的方式,确保了客户端和服务器之间的通信不被窃听或篡改。本文将详细介绍如何...
在Kubernetes(K8S)集群环境中,安全套接字层(SSL)证书的监控是确保服务安全和稳定的重要环节。SSL证书用于加密网络通信,确保数据传输的安全性。`ssl-exporter`是一款专为监控SSL/TLS证书状态设计的Prometheus ...
在Python编程过程中,有时会遇到导入模块时遇到错误,例如"ImportError: No module named _ssl"。这个错误通常表示Python无法找到SSL模块,该模块是Python标准库的一部分,用于处理安全套接层(SSL)和传输层安全...
**Apache SSL 插件:mod_ssl** Apache HTTP Server 是世界上最流行的Web服务器软件,而mod_ssl是Apache的一个核心模块,专门用于实现安全套接层(SSL)协议,为网站提供安全的HTTPS服务。SSL(Secure Sockets Layer...
SSL/TLS(安全套接层/传输层安全)协议是互联网上广泛使用的安全通信协议,用于在客户端(如浏览器)和服务器之间建立安全、私密的连接,保护数据免受窃听和篡改。RFC5246文档是SSL/TLS协议的最新版本,正式名为...
SSL(Secure Sockets Layer)证书是互联网安全领域的重要组成部分,用于加密用户与服务器之间的通信,确保数据在传输过程中不被窃取或篡改。在本地生成SSL证书,可以帮助开发者在测试环境中模拟真实环境的安全设置,...
### 信安SSL配置知识点详解 #### 一、实施步骤和操作过程 1. **登录管理界面**: - **管理口**: 设备的Port1口,地址为192.168.1.99。 - **登录方式**: - 直接连接笔记本电脑至设备的Port1口并通过浏览器访问`...
### STM32 实现SSL通讯 #### 一、引言 随着网络安全日益受到重视,确保数据传输的安全性成为了一个不容忽视的问题。对于嵌入式系统而言,如何在资源受限的条件下实现安全通信变得尤为重要。本篇文章将基于STM32F...
### ApacheFtpServer之ssl配置详解 #### 一、FTPS概述 FTPS(File Transfer Protocol Secure),即安全文件传输协议,是一种通过SSL/TLS(Secure Sockets Layer/Transport Layer Security)来保护传统FTP(File ...
本文将详细介绍如何在Nginx服务器上配置SSL自签名证书。 首先,我们需要生成自签名SSL证书。这通常包括以下步骤: 1. **生成RSA密钥**:使用`openssl genrsa`命令创建一个带有密码保护的RSA私钥。例如,`openssl ...
ssl_session_cache shared:SSL:10m; # 管理 SSL 会话缓存 ssl_session_timeout 10m; # 设置 SSL 会话超时时间 ``` 6. **处理静态资源**: - 通过 `location` 块配置,Nginx 可以高效地处理各种静态文件请求,...
在本文中,我们将深入探讨如何使用Visual C++(VC)进行SSL通信,主要基于OpenSSL库来实现Socket服务器和客户端的交互。SSL(Secure Sockets Layer)是一种安全协议,用于在互联网上提供加密通信和身份验证,而...
本报告就如何配置SSL/TLS以提供最先进的身份验证和加密技术提出了一般性建议。ssl引擎提供的选项是从 自从Netscape开发SSL2.0以来的早期。TLS的引入使问题变得更具有挑战性,因为服务器和客户端根据各个ssl引擎提供...
SSL证书在线生成系统源码是实现网站安全的重要工具,它基于公钥基础设施(PKI)原理,用于在互联网上建立安全的数据传输通道。本系统允许用户通过在线方式申请并生成SSL证书,简化了传统SSL证书获取流程,提升了用户...
### 超微H12SSL-C用户手册关键知识点解析 #### 一、产品概述与文档准确性声明 根据所提供的文件信息,“超微H12SSL-C用户手册”是一份关于超微H12SSL-C系列服务器主板(包括H12SSL-i/C/CT/NT型号)的操作指南。该...
在Linux环境下,使用C语言编写基于SSL(Secure Socket Layer)的TCP程序是一项常见的任务,尤其在开发安全通信软件时。SSL是一种网络安全协议,用于在Internet上提供加密通信和身份验证。下面将详细介绍如何在Linux...
SSL(Secure Socket Layer)是一种广泛使用的网络安全协议,其主要任务是提供加密通信和身份认证,确保数据在网络传输过程中的安全性和完整性。SSL的工作原理涉及到多个关键概念和技术。 首先,SSL的核心在于加密,...
在Android平台上,SSL(Secure Sockets Layer)证书验证是一个关键的安全环节,用于保护应用程序与服务器之间的通信不被窃听或篡改。SSL证书是身份验证的一种方式,它确保了用户与服务器之间的连接是安全的,数据...
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 网上的方法都是在CentOS下进行的,而我用的是Deepin系统,也就是基于Ubuntu/Debian的发行版...