前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用Nginx将服务从http升级到https

利用Nginx将服务从http升级到https

作者头像
Homqyy
发布于 2023-03-06 05:26:28
发布于 2023-03-06 05:26:28
3.3K00
代码可运行
举报
文章被收录于专栏:知行合一知行合一
运行总次数:0
代码可运行

前言

随着对安全性的关注,无论是个人还是企业或多或少都有从http升级到https的需求,但升级过程说着简单,整个过程却没有那么顺畅。这里我以个人的升级过程为例,给予一些参考。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
背景:
在升级之前,我本人是做过部署方案设计的,且以前也从事过相关工作,因此对此次升级是非常乐观的,晚上10点下班到家,预计是12点之前应该可以完成升级。
然而整个过程真可以说是“理想很丰满,现实很骨感”:搞到了凌晨3点还没能完全解决,直到第二天才把遗留的最后一个问题解决了。(不过我很享受这样的过程,每一次未知问题的出现都代表着一次提升的机会。)

接着我会从“方案》实施》排障”顺序分享整个升级过程。

方案

在我升级https前,已经用http一段时间了,此次升级针对的是其中两个HTTP服务:“wordpress”(博客)和“jenkins”(CI/CD)。

在升级上我考虑了两种方案:

  • 方案1:直接将“wordpress”和“jenkins”服务分别升级到HTTPS
  • 方案2:通过反向代理来提供HTTPS的能力,最后卸载成HTTP后代理到“wordpress”和“jenkins”

其中,“方案1”有一个可预见的问题,由于我的云服务器上只有一个公网IP,因此如果分别都升到HTTPS的话,那么则必须使用不同的端口(非443),这样在使用上是较为不便利的。而“方案2”则可以通过“虚拟服务”的方法解决此问题,同时,“方案2”还可以应对未来可能继续增加的HTTPS或SSL服务。故而选择了“方案2”:

方案2示例图

如上所示,我选择了“Nginx”作为反向代理服务器,对外提供HTTPS能力,保留服务器原本的HTTP服务(由于“Nginx”、“wordpress”和“jenkins”在同一台机器中,因此使用HTTP并不会造成任何问题)。

由于nginx需要对两个服务都支持HTTPS,正常我们可以通过域名或URI进行解决,我选择采用的是域名,其中:

因为HTTPS需要用到证书,因此接着需要搞定证书问题,这里选择的是从“Let’s encrypt”签发免费证书。至此,方案工作已经完成。

实施

获取证书

这里可以直接参阅“Let’s encrypt”网站进行证书的获取,因为我的操作系统是“CentOS 8”,因此我参阅的是官方提供的如下教程:<https://certbot.eff.org/instructions?ws=other&os=centosrhel8>

最后证书如下所示:

证书示例图

  • jenkins.homqyy.cn目录:存放了jenkins.homqyy.cn这个站点的证书和密钥
  • www.homqyy.cn目录:存放了www.homqyy.cn这个站点的证书和密钥

站点目录里面存放的有如下文件:

  • cert.pem:站点证书
  • chain.pem:中间证书
  • fullchain.pem:完整证书链(站点证书+中间证书)
  • privkey.pem:站点密钥

部署Nginx

注意:这里我并没有使用官方的“Nginx”镜像,而是“Nginx”的分支“Hengine”。

由于我的所有服务都是Docker化的,使用的docker-compose进行编排和管理工作,下面给出一个数据调整过的最简样例文件docker-compose.yml(对Docker感兴趣的可以跟进我的《Docker系列》文章):

部署样例图

  • 如上所示,我们增加了proxy提供反向代理。(感兴趣的朋友在阅读完后面内容后,可以在准备好本文提及的配置后,将附录的文件放到个人的docker主机上,并按需修改,最终执行docker-compose up -d以运行上述服务)
  • 这里有个需要注意的就是proxy服务中的volumes,属于代理的配置部分,因此需要个人提供。提供的内容为:
    • 证书密钥:将个人的证书密钥目录./proxy/certs放置到/usr/local/hengine/conf/certs中,供HTTPS使用。
    • nginx配置文件:将个人的nginx配置./proxy/conf/nginx.conf放置到/usr/local/hengine/conf/nginx.conf,以用个人配置代替hengine的默认配置。

接着重点就是编写nginx.conf(就是上文提到的./proxy/conf/nginx.conf)文件了,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes 2;

user root;

error_log logs/info.log info;

events {
    use epoll;
    worker_connections 1024;
}

http {

    #
    # 重定向 http 到 https
    #
    server {
        listen 80;
        server_name *.homqyy.cn;

        return 301 https://$host$request_uri;
    }

    #
    # 代理Jenkins服务,提供HTTPS能力
    #
    server {
        listen 443 ssl;
        server_name jenkins.homqyy.cn;

        ssl_certificate certs/jenkins.homqyy.cn/fullchain.pem;
        ssl_certificate_key certs/jenkins.homqyy.cn/privkey.pem;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_set_header Host $host;
            proxy_set_header Connection "";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_http_version 1.1;

            proxy_pass http://jenkins:8080;
        }
    }

    #
    # 代理博客服务,提供HTTPS能力
    #
    server {
        listen 443 ssl default_server;
        server_name www.homqyy.cn;

        ssl_certificate certs/www.homqyy.cn/fullchain.pem;
        ssl_certificate_key certs/www.homqyy.cn/privkey.pem;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_set_header Host $host;
            proxy_set_header Connection "";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_http_version 1.1;

            proxy_pass http://blog;
        }
    }
}

上面有几个关键指令:

  • listen:监听的端口,我们这里两个服务都是443,同时通过ssl来表明此端口是用SSL(TLS)加密的,在HTTP中即是HTTPS。
  • server_name:虚拟服务的名称,就是通过此名称来区分是“jenkins”还是“博客”
  • ssl_certificate:站点证书,这里务必使用完整的证书链”fullchain.pem
  • ssl_certificate_key:站点密钥
  • proxy_pass:代理到后端服务

一切准备继续,通过docker将proxy服务启动:docker-compose up -d proxy

排障

博客问题

随着proxy的运行和测试共发现两个问题

  • 访问站点的时候,资源加载失败。
  • 登录博客的时候,是http,而非期望的https
【定位分析】

通过F12(谷歌浏览器)查看资源加载情况,发现资源加载失败的原因是因为资源路径全是http://开头的绝对路径。

【解决方案】

通过“Hengine”的ngx_http_sub_modulehttp://改为https://,其配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        ...

        location / {
            ...

            sub_filter 'https://www.homqyy.cn' 'https://www.homqyy.cn';
            sub_filter 'http:\\/\\/www.homqyy.cn' 'https:\\/\\/www.homqyy.cn';
            sub_filter_types *;
            sub_filter_once off;

            proxy_pass http://blog;
        }
  • sub_filter:如上图所示,我们这里写了两条替换规则,是因为通过F12分析资源的时候发现,博客中的http资源有两个写法,一个是http://,另一个是http:\/\/
【测试结果】

仍旧无法加载资源:通过F12发现资源路径仍旧是http://,后面观察HTTP头部发现响应采用了GZIP的压缩算法,于是我在“Hengine”中增加了proxy_set_header Accept-Encoding配置,来阻止传递“压缩指示”给博客站点。

再次访问,能正常访问并加载资源,但是在登录账户的时候发现页面被重定向为http了,这肯定是不能接受的,因为它会导致账号信息以明文传输。浏览官网文档后发现官网有提供反向代理的解决方案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
define('FORCE_SSL_ADMIN', true);
// in some setups HTTP_X_FORWARDED_PROTO might contain
// a comma-separated list e.g. http,https
// so check for https existence
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';

总结官网描述后需做如下两个操作:

  1. wp-config.php文件中增加define('FORCE_SSL_ADMIN', true);,增加以后如上面所示。
  2. 代理到wordpress的时候添加头部:HTTP_X_FORWARDED_PROTO: https

再次尝试“登录”操作,发现一切正常。经过修改后的完整博客代理配置为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    #
    # 代理博客服务,提供HTTPS能力
    #
    server {
        listen 443 ssl default_server;
        server_name www.homqyy.cn;

        ssl_certificate certs/www.homqyy.cn/fullchain.pem;
        ssl_certificate_key certs/www.homqyy.cn/privkey.pem;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_set_header Host $host;
            proxy_set_header Accept-Encoding "";
            proxy_set_header Connection "";
            proxy_set_header HTTP_X_FORWARDED_PROTO "https";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_http_version 1.1;

            sub_filter 'https://www.homqyy.cn' 'https://www.homqyy.cn';
            sub_filter 'http:\\/\\/www.homqyy.cn' 'https:\\/\\/www.homqyy.cn';
            sub_filter_types *;
            sub_filter_once off;

            proxy_pass http://blog;
        }
    }

jenkins问题

jenkins的问题主要就是会出现重定向到http的情况

因此在“Hengine”中增加配置proxy_redirect http://jenkins.homqyy.cn https://jenkins.homqyy.cn;来解决此问题,最后完整配置如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    #
    # 代理Jenkins服务,提供HTTPS能力
    #
    server {
        listen 443 ssl;
        server_name jenkins.homqyy.cn;

        ssl_certificate certs/jenkins.homqyy.cn/fullchain.pem;
        ssl_certificate_key certs/jenkins.homqyy.cn/privkey.pem;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_set_header Host $host;
            proxy_set_header Connection "";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_http_version 1.1;
            proxy_redirect http://jenkins.homqyy.cn https://jenkins.homqyy.cn;

            proxy_pass http://jenkins:8080;
        }
    }

最后

其实通过反向代理进行站点部署还有很多好处,其中包括安全和性能。而从本文最直观的好处就是:既可以避免改动站点代码(改动代码必然带来了风险)从而加快升级过程,同时还可以从容的应对未来增加https或ssl服务的需求。最后我还结合了docker的编排和管理能力,大大的减少了部署、升级等成本。

访问博客站点能看到连接安全图标:

访问博客站点示例图

访问jenkins站点也能看到连接安全图标:

访问jenkins站点示例图

附录

docker-compose.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3.8'
services:
    proxy:
        image: homqyy/hengine
        restart: always
        ports:
            - "443:443/tcp"
            - "80:80/tcp"
        volumes:
            - ./proxy/certs/:/usr/local/hengine/conf/certs/:ro
            - ./proxy/conf/nginx.conf:/usr/local/hengine/conf/nginx.conf:ro

    blog:
        image: wordpress
        restart: always
        environment:
            WORDPRESS_DB_HOST: db
            WORDPRESS_DB_USER: exampleuser
            WORDPRESS_DB_PASSWORD: examplepass
            WORDPRESS_DB_NAME: exampledb
        volumes:
            - wordpress:/var/www/html


    db:
        image: mysql:5.7
        restart: always
        environment:
            MYSQL_DATABASE: exampledb
            MYSQL_USER: exampleuser
            MYSQL_PASSWORD: examplepass
            MYSQL_RANDOM_ROOT_PASSWORD: '1'
        volumes:
            - db:/var/lib/mysql

    jenkins:
        image: jenkins/jenkins:lts-jdk11
        restart: always
        environment:
            JAVA_OPTS: '-Dhudson.footerURL=https://www.homqyy.cn'
        volumes:
            - jenkins:/var/jenkins_home

volumes:
    wordpress:
    db:
    jenkins:
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月8日20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
基于银河麒麟系统部署 Nginx(常见问题总结,建议收藏保存!)
在当今的互联网时代,Nginx 作为一款高性能的 Web 服务器和反向代理服务器,因其轻量级、高并发处理能力和灵活的配置而被广泛应用于各种 Web 应用场景。银河麒麟操作系统(Kylin OS)作为一款国产操作系统,以其稳定性和安全性在众多领域得到了广泛应用。本文将详细介绍如何在银河麒麟操作系统上部署 Nginx,包括安装、配置、优化以及常见问题的排查与解决,帮助读者快速掌握在银河麒麟系统上部署 Nginx 的全过程。
全干程序员demo
2025/04/18
4030
基于银河麒麟系统部署 Nginx(常见问题总结,建议收藏保存!)
nginx反向代理http和https共同使用 双存在
不能自适应协议,也不支持协议变量,各种百度啊,两个钟头,测试了各种,都不适用宝塔,
墨渊
2018/07/13
1.3K2
网络集群节点自动切换nginx负载均衡,自动生成nginx配置文件。小绿叶技术博客--中央集成--外层公共能源控制系统--集群网络节点控制--主驱动
eisc
2025/05/07
1050
SSL证书自动化如此简单-certbot实践
方式一:用指定根目录的方式,会在根目录下创建一个.well-known来验证域名的所有权
用户10002156
2024/01/05
8450
SSL证书自动化如此简单-certbot实践
使用 Certbot 配置 HTTPS,让你的网站不再裸奔
不错,今天的主角就是给力的 Certbot,免费好用,真是我等 diaosi 的一大福音。
周萝卜
2019/07/23
1.4K0
使用 Certbot 配置 HTTPS,让你的网站不再裸奔
Cloudreve 云盘配置开启https,和conf.ini介绍
现在服务器都是https协议了,而默认项安装的Cloudreve没有开启https。这里介绍下如何配置https
zinyan.com
2022/12/07
5K0
免费https证书安装(Nginx)
对于站点来说,使用https访问能增强数据传输的安全性,避免一些安全事故,同时拥有了https认证,在主流浏览器中都被被标记为可信任的安全的网站,也能加强搜索引擎的对https站点的收录。
肓己
2021/08/12
1.6K0
Nginx+Varnish+Angular universal实现服务端页面渲染缓存
项目使用angular universal实现服务端渲染,为了减轻服务器的压力,需要将用户频繁访问的页面进行缓存,这样就不必每次都去渲染相同的页面(例如首页),angular universal在features中有提到考虑加入缓存,但就目前来说,varnish是个不错的选择,但是varnish不支持https,所以还需要用nginx进行端口的转发
星哥玩云
2022/07/13
9970
宝塔配置SSL证书
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
收心
2022/12/10
1.6K0
Web 版 SSH Gateone
我的 Web Server 用的 Nginx,Gateone 也用到了 Nginx 的代理功能,所以选择了 Nginx。可以自己编译安装,也可以用 oneinstack,LNMP 一键包等;证书用的是 Let’s Encrypt。
eallion
2022/12/20
3730
Let’s Encrypt免费ssl证书申请
Let’s Encrypt是一个免费并且开源的CA,且已经获得Mozilla、微软等主要浏览器厂商的根授信。它极大低降低DV证书的入门门槛,进而推进全网的HTTPS化。
爱游博客
2019/08/07
4.2K0
你的网站HTTPS了吗 | Let’s Encrypt
前言 下午,图书馆闭馆了了、得找一个安全的地方上网(o)/~,一直听说着Let’s Encrypt。前几天玩了一下,但是本地运行Let’s Encrypt不能生成证书,Maybe School DNS question :-D,那就在腾讯云服务器玩玩。 ---- Let’s Encrypt Let's Encrypt是由EFF、Mozilla、Cisco、Akamai、IdenTrust与密西根大学研究人员共同创立的免费的凭证中心,目的在于推动全球所有的网站都使用HTTPS加密传输,创建一个更安全、更具
AlicFeng
2018/06/08
2.4K0
使用容器搭建自己的gitlab
启动镜像,注意先建立/home/gitlab,免得容器销毁数据全无。 还要注意,因为git使用22号端口,这里映射的是1222端口。所以,只能使用http方式来进行项目的clone和操作。
超级大猪
2019/11/22
4670
为 Docker 中的 Nginx 配置 HTTPS
没有 https 加持的网站会逐渐地被浏览器标记为不安全的,所以为网站添加 https 已经变得刻不容缓。对于商业网站来说,花钱购买 SSL/TLS 证书并不是什么问题。但对于个人用户来说,如果能有免费的 SSL/TLS 证书可用将会是非常幸福的事情!Let's Encrypt 就是一个提供免费 SSL/TLS 证书的网站,由于其证书期限只有三个月,所以需要我们用自动化的方式去更新证书。本文将介绍如何为通过 docker 运行的 nginx 中的站点添加 https 支持,并自动完成证书的更新。本文的演示环境为:运行在 Azure 上的 Ubuntu 16.04 主机(此图来自互联网):
星哥玩云
2022/07/14
1.7K0
为 Docker 中的 Nginx 配置 HTTPS
使用Let's Encrypt免费证书实现https
Let's Encrypt是一家免费、开放、自动化的证书颁发机构(CA),为公众的利益而运行(由非盈利组织互联网安全研究小组(ISRG)运营)。
极客运维圈
2020/06/01
1.8K0
使用Let's Encrypt免费证书实现https
使用Let's Encrypt的SSL证书配置HTTPS手记
前段时间,看见很多大会都在分享全站HTTPS的经验。HTTPS固然好,前提是SSL证书,并且签发证书的机构要靠谱。沃通的CA证书就相继被Mozilla和Google封杀了。曾经对于普通用户,权威,安全,并且免费的证书无疑就像天上的星星,可望而不可及。现在,这些星星变成了馅饼掉了下来。没错,我们可以申请安全免费的ssl证书--- Let's Encrypt。 Let’s Encrypt是电子前哨基金会(EFF)发布的免费 SSL 证书服务,Google,Mozilla和Microsoft都极力支持。很早之前就
李海彬
2018/03/19
2.5K0
使用Let's Encrypt的SSL证书配置HTTPS手记
容器部署bitwarden服务
如果有域名的话,可以使用nginx来做反向代理。首先为这个业务申请证书。可以使用lets encrypt的服务。
超级大猪
2020/12/01
4.4K1
容器部署bitwarden服务
Nexus:搭建私人Maven仓库
访问 Oracle 官网来获取 Java 8/11/17/latest 版本,Windows 平台可通过 x64 Compressed Archive 安装、Linux 用户可通过 Arm 64 Compressed Archive 获得压缩包。 安装 Java 需要将 Java 环境写入运行环境中,windows 平台通过配置即可、Linux/macOS 平台需要通过 vim 操作。
DioxideCN
2022/09/23
2.1K0
Nexus:搭建私人Maven仓库
Nginx配置反向代理 java服务和前端服务
终有链响
2024/07/29
2770
利用 Nginx 做反向代理解决微信小程序业务域名限制问题
[查看原文] https://fyh.me/2018/07/12/nginx-docker-miniprogram/
fanyinghao
2018/07/22
8.6K0
推荐阅读
相关推荐
基于银河麒麟系统部署 Nginx(常见问题总结,建议收藏保存!)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验