<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://md5.pw/index.php?action=history&amp;feed=atom&amp;title=%E9%83%A8%E7%BD%B2https%E4%B8%AD%E8%BD%AC%E6%9C%8D%E5%8A%A1%E6%95%99%E7%A8%8B</id>
	<title>部署https中转服务教程 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://md5.pw/index.php?action=history&amp;feed=atom&amp;title=%E9%83%A8%E7%BD%B2https%E4%B8%AD%E8%BD%AC%E6%9C%8D%E5%8A%A1%E6%95%99%E7%A8%8B"/>
	<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E9%83%A8%E7%BD%B2https%E4%B8%AD%E8%BD%AC%E6%9C%8D%E5%8A%A1%E6%95%99%E7%A8%8B&amp;action=history"/>
	<updated>2026-04-12T20:35:02Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://md5.pw/index.php?title=%E9%83%A8%E7%BD%B2https%E4%B8%AD%E8%BD%AC%E6%9C%8D%E5%8A%A1%E6%95%99%E7%A8%8B&amp;diff=791&amp;oldid=prev</id>
		<title>2025年12月23日 (二) 17:41 Liam</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E9%83%A8%E7%BD%B2https%E4%B8%AD%E8%BD%AC%E6%9C%8D%E5%8A%A1%E6%95%99%E7%A8%8B&amp;diff=791&amp;oldid=prev"/>
		<updated>2025-12-23T17:41:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2025年12月23日 (二) 10:41的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l248&quot;&gt;第248行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第248行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;root@ubuntu:/home/docker/nginx# docker exec -it nginx nginx -s reload&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;root@ubuntu:/home/docker/nginx# docker exec -it nginx nginx -s reload&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:500 常见应用指南 — Application Guides]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff:1.41:old-790:rev-791:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Liam</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E9%83%A8%E7%BD%B2https%E4%B8%AD%E8%BD%AC%E6%9C%8D%E5%8A%A1%E6%95%99%E7%A8%8B&amp;diff=790&amp;oldid=prev</id>
		<title>Lusky0：​创建页面，内容为“== 为什么要做https转发 == 因为公司业务在美国，服务器已经使用很久，迁移非常麻烦，现在正好有瓦工稳定机器故想到这个解决方案，可能不是最优，但是目前满足我的业务稳定分享给大家，如有不足欢迎大佬们指点。   == 部署Nginx == ==== 宿主机先创建这些文件 ==== &lt;pre&gt; /home/docker/nginx/nginx.conf /home/docker/nginx/conf.d /home/docker/nginx/log /home/docker/nginx/html /home/…”</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E9%83%A8%E7%BD%B2https%E4%B8%AD%E8%BD%AC%E6%9C%8D%E5%8A%A1%E6%95%99%E7%A8%8B&amp;diff=790&amp;oldid=prev"/>
		<updated>2025-12-23T09:44:55Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“== 为什么要做https转发 == 因为公司业务在美国，服务器已经使用很久，迁移非常麻烦，现在正好有瓦工稳定机器故想到这个解决方案，可能不是最优，但是目前满足我的业务稳定分享给大家，如有不足欢迎大佬们指点。   == 部署Nginx == ==== 宿主机先创建这些文件 ==== &amp;lt;pre&amp;gt; /home/docker/nginx/nginx.conf /home/docker/nginx/conf.d /home/docker/nginx/log /home/docker/nginx/html /home/…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 为什么要做https转发 ==&lt;br /&gt;
因为公司业务在美国，服务器已经使用很久，迁移非常麻烦，现在正好有瓦工稳定机器故想到这个解决方案，可能不是最优，但是目前满足我的业务稳定分享给大家，如有不足欢迎大佬们指点。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 部署Nginx ==&lt;br /&gt;
==== 宿主机先创建这些文件 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/docker/nginx/nginx.conf&lt;br /&gt;
/home/docker/nginx/conf.d&lt;br /&gt;
/home/docker/nginx/log&lt;br /&gt;
/home/docker/nginx/html&lt;br /&gt;
/home/docker/nginx/ssl&lt;br /&gt;
/home/docker/letsencrypt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 安装docker ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -fsSL https://get.docker.com -o install-docker.sh&lt;br /&gt;
sudo sh install-docker.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 启动脚本startNginx.sh =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker run \&lt;br /&gt;
-p 80:80 \&lt;br /&gt;
-p 443:443 \&lt;br /&gt;
-p 8081:8081 \&lt;br /&gt;
--name nginx \&lt;br /&gt;
-v /home/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \&lt;br /&gt;
-v /home/docker/nginx/conf.d:/etc/nginx/conf.d \&lt;br /&gt;
-v /home/docker/nginx/log:/var/log/nginx \&lt;br /&gt;
-v /home/docker/nginx/html:/usr/share/nginx/html \&lt;br /&gt;
-v /home/docker/nginx/ssl:/etc/nginx/ssl \&lt;br /&gt;
-v /home/docker/letsencrypt:/var/www/letsencrypt \&lt;br /&gt;
-d nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 证书自动续期ssl_auto.sh ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# ==============================&lt;br /&gt;
#  智能 SSL 自动管理脚本&lt;br /&gt;
#  - 每日检查证书剩余天数&lt;br /&gt;
#  - ≤30 天自动续期&lt;br /&gt;
#  - webroot 模式（不中断服务）&lt;br /&gt;
# ========== 运行模式 ==========&lt;br /&gt;
DRY_RUN=false   # true = 测试模式（不真正续期）&lt;br /&gt;
# ==============================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NGINX_CONTAINER=&amp;quot;nginx&amp;quot;&lt;br /&gt;
WEBROOT=&amp;quot;/home/docker/letsencrypt&amp;quot;&lt;br /&gt;
SSL_DIR=&amp;quot;/home/docker/nginx/ssl&amp;quot;&lt;br /&gt;
RENEW_BEFORE_DAYS=30&lt;br /&gt;
&lt;br /&gt;
DOMAINS=(&lt;br /&gt;
  &amp;quot;xxxxx&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;============================&amp;quot;&lt;br /&gt;
echo &amp;quot; 🔐 SSL 自动检查启动 $(date)&amp;quot;&lt;br /&gt;
echo &amp;quot;============================&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mkdir -p &amp;quot;$WEBROOT/.well-known/acme-challenge/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
need_restart_nginx=false&lt;br /&gt;
&lt;br /&gt;
for DOMAIN in &amp;quot;${DOMAINS[@]}&amp;quot;; do&lt;br /&gt;
  CERT_PATH=&amp;quot;/etc/letsencrypt/live/$DOMAIN/fullchain.pem&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;&amp;quot;&lt;br /&gt;
  echo &amp;quot;👉 检查域名：$DOMAIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # 如果证书不存在，直接申请&lt;br /&gt;
  if [ ! -f &amp;quot;$CERT_PATH&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;⚠  未发现证书，立即申请&amp;quot;&lt;br /&gt;
    renew=true&lt;br /&gt;
  else&lt;br /&gt;
    # 获取过期时间&lt;br /&gt;
    expire_date=$(openssl x509 -enddate -noout -in &amp;quot;$CERT_PATH&amp;quot; | cut -d= -f2)&lt;br /&gt;
    expire_ts=$(date -d &amp;quot;$expire_date&amp;quot; +%s)&lt;br /&gt;
    now_ts=$(date +%s)&lt;br /&gt;
&lt;br /&gt;
    days_left=$(( (expire_ts - now_ts) / 86400 ))&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;📅 剩余有效期：$days_left 天&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if [ &amp;quot;$days_left&amp;quot; -le &amp;quot;$RENEW_BEFORE_DAYS&amp;quot; ]; then&lt;br /&gt;
      echo &amp;quot;⏰ 低于 $RENEW_BEFORE_DAYS 天，需要续期&amp;quot;&lt;br /&gt;
      renew=true&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;✅ 证书仍然有效，跳过&amp;quot;&lt;br /&gt;
      renew=false&lt;br /&gt;
    fi&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
#   if [ &amp;quot;$renew&amp;quot; = true ]; then&lt;br /&gt;
#     echo &amp;quot;🔄 正在申请/续期：$DOMAIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#     certbot certonly \&lt;br /&gt;
#       --webroot -w &amp;quot;$WEBROOT&amp;quot; \&lt;br /&gt;
#       -d &amp;quot;$DOMAIN&amp;quot; \&lt;br /&gt;
#       --non-interactive \&lt;br /&gt;
#       --agree-tos \&lt;br /&gt;
#       -m admin@$DOMAIN&lt;br /&gt;
&lt;br /&gt;
#     if [ $? -ne 0 ]; then&lt;br /&gt;
#       echo &amp;quot;❌ 续期失败：$DOMAIN&amp;quot;&lt;br /&gt;
#       continue&lt;br /&gt;
#     fi&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$renew&amp;quot; = true ]; then&lt;br /&gt;
  echo &amp;quot;🔄 正在申请/续期：$DOMAIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  CERTBOT_ARGS=(&lt;br /&gt;
    certonly&lt;br /&gt;
    --webroot -w &amp;quot;$WEBROOT&amp;quot;&lt;br /&gt;
    -d &amp;quot;$DOMAIN&amp;quot;&lt;br /&gt;
    --non-interactive&lt;br /&gt;
    --agree-tos&lt;br /&gt;
    -m admin@$DOMAIN&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$DRY_RUN&amp;quot; = true ]; then&lt;br /&gt;
    CERTBOT_ARGS+=(--dry-run)&lt;br /&gt;
    echo &amp;quot;🧪 DRY-RUN 模式：仅测试，不会真正更新证书&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  certbot &amp;quot;${CERTBOT_ARGS[@]}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [ $? -ne 0 ]; then&lt;br /&gt;
    echo &amp;quot;❌ 续期失败：$DOMAIN&amp;quot;&lt;br /&gt;
    # 这里之后你可以接邮件/钉钉告警&lt;br /&gt;
    continue&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;✅ certbot 执行成功：$DOMAIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # dry-run 模式不做后续动作&lt;br /&gt;
  if [ &amp;quot;$DRY_RUN&amp;quot; = true ]; then&lt;br /&gt;
    echo &amp;quot;🧪 DRY-RUN 模式：跳过证书复制与 Nginx 重启&amp;quot;&lt;br /&gt;
    continue&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;✅ 续期成功：$DOMAIN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 复制到 nginx ssl 目录&lt;br /&gt;
    cp -f /etc/letsencrypt/live/$DOMAIN/fullchain.pem \&lt;br /&gt;
      $SSL_DIR/$DOMAIN.pem&lt;br /&gt;
    cp -f /etc/letsencrypt/live/$DOMAIN/privkey.pem \&lt;br /&gt;
      $SSL_DIR/$DOMAIN.key&lt;br /&gt;
&lt;br /&gt;
    chmod 644 $SSL_DIR/$DOMAIN.pem&lt;br /&gt;
    chmod 600 $SSL_DIR/$DOMAIN.key&lt;br /&gt;
&lt;br /&gt;
    need_restart_nginx=true&lt;br /&gt;
    echo &amp;quot;📦 证书已更新到 Nginx 目录&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# 如有证书更新才重启 nginx&lt;br /&gt;
if [ &amp;quot;$need_restart_nginx&amp;quot; = true ]; then&lt;br /&gt;
  echo &amp;quot;&amp;quot;&lt;br /&gt;
  echo &amp;quot;🔄 重启 Nginx 容器&amp;quot;&lt;br /&gt;
  docker restart $NGINX_CONTAINER&lt;br /&gt;
  echo &amp;quot;✅ Nginx 重启完成&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
  echo &amp;quot;&amp;quot;&lt;br /&gt;
  echo &amp;quot;ℹ️  无证书变更，无需重启 Nginx&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;🎉 SSL 检查完成&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nginx.conf配置文件 ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    server_name xxx;&lt;br /&gt;
&lt;br /&gt;
    location /.well-known/acme-challenge/ {&lt;br /&gt;
        alias /var/www/letsencrypt/.well-known/acme-challenge/;&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        return 301 https://$host$request_uri;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
upstream put_api_backend {&lt;br /&gt;
    server xxxxx:443;&lt;br /&gt;
    keepalive 100;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl;&lt;br /&gt;
    server_name xxx;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate     /etc/nginx/ssl/xxx.pem;&lt;br /&gt;
    ssl_certificate_key /etc/nginx/ssl/xxx.key;&lt;br /&gt;
&lt;br /&gt;
    ssl_protocols TLSv1.2 TLSv1.3;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!MD5;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/xxx.access.log;&lt;br /&gt;
    error_log  /var/log/nginx/xxx.error.log warn;&lt;br /&gt;
&lt;br /&gt;
    # ACME challenge（HTTPS 续期仍然需要）&lt;br /&gt;
    location /.well-known/acme-challenge/ {&lt;br /&gt;
        alias /var/www/letsencrypt/.well-known/acme-challenge/;&lt;br /&gt;
        try_files $uri =404;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # API 中转&lt;br /&gt;
    location /api {&lt;br /&gt;
        proxy_pass https://put_api_backend;&lt;br /&gt;
        proxy_ssl_server_name on;&lt;br /&gt;
&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        proxy_set_header Host xxx;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
&lt;br /&gt;
        proxy_connect_timeout 5s;&lt;br /&gt;
        proxy_read_timeout    30s;&lt;br /&gt;
        proxy_send_timeout    30s;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # 其他路径拒绝&lt;br /&gt;
    location / {&lt;br /&gt;
        return 404;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 重启Nginx ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker exec -it nginx nginx -t&lt;br /&gt;
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok&lt;br /&gt;
nginx: configuration file /etc/nginx/nginx.conf test is successful&lt;br /&gt;
root@ubuntu:/home/docker/nginx# docker exec -it nginx nginx -s reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lusky0</name></author>
	</entry>
</feed>