首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >架构师实战:Nginx 生产级源码部署与内部可信自签证书全指南

架构师实战:Nginx 生产级源码部署与内部可信自签证书全指南

作者头像
IT小马哥
发布2026-04-24 10:31:07
发布2026-04-24 10:31:07
2100
举报
文章被收录于专栏:Java TaleJava Tale

前言

在内部开发、测试或预生产环境中,我们经常需要快速部署 HTTPS 服务,但又无法为每个内部域名或 IP 申请公共 CA 签发的证书。同时,使用系统包管理器(如 yum install nginx)虽然便捷,但往往版本滞后,且难以定制编译模块。

本文将从架构师视角,完整记录如何在 CentOS 7/8 类环境中,通过源码编译安装 Nginx(便于定制模块和优化路径),并结合 mkcert 工具,实现全链路可信的自签证书方案。该方案的核心价值在于:

  1. 源码可控:自主选择版本和编译模块,避免操作系统依赖。
  2. 权限最小化:使用 setcap 赋予 Nginx 绑定特权端口能力,无需以 root 运行进程。
  3. 证书信任闭环:通过 mkcert 统一管理根证书,解决浏览器“不安全”警告问题,提升内部体验。

第一部分:Nginx 生产级源码安装

1. 环境准备与依赖安装

生产环境建议预先安装编译工具链和必需的开发库。

bash

代码语言:javascript
复制
# 安装编译器和基础库 (gcc, pcre, zlib, openssl)
sudo yum install gcc pcre-devel zlib-devel openssl-devel make -y

2. 下载与解压

选择稳定的主线版本或稳定版。以 1.30.0 为例:

bash

代码语言:javascript
复制
wget https://nginx.org/download/nginx-1.30.0.tar.gz
tar -zxvf nginx-1.30.0.tar.gz
cd nginx-1.30.0

3. 编译配置(架构关键点)

此处根据生产需求,启用 http_ssl_module(HTTPS)、http_v2_module(HTTP/2)、http_gzip_static_module(静态压缩)。并设定规范安装路径 /usr/local/nginx

bash

代码语言:javascript
复制
./configure --prefix=/usr/local/nginx \
            --with-http_ssl_module \
            --with-http_v2_module \
            --with-http_gzip_static_module

# 并行编译并安装 (make -j 可利用多核)
make -j $(nproc)
sudo make install

4. 配置 systemd 服务(标准运维)

创建系统服务文件,实现标准化启停和开机自启。

bash

代码语言:javascript
复制
sudo vi /etc/systemd/system/nginx.service

填入以下内容(注意根据实际路径修改 PIDFile 及配置路径):

ini

代码语言:javascript
复制
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启动与管理:

bash

代码语言:javascript
复制
sudo systemctl daemon-reload
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

5. 权限最小化实践(架构亮点)

默认 Nginx 需要以 root 启动才能绑定 80/443 端口。生产环境建议使用普通用户运行,并通过 setcap 赋予二进制文件绑定特权端口的能力。

bash

代码语言:javascript
复制
# 假设运行用户为 nginx (需预先创建)
# 赋予 cap_net_bind_service 能力
sudo setcap 'cap_net_bind_service=+ep' /usr/local/nginx/sbin/nginx

# 验证能力已设置
getcap /usr/local/nginx/sbin/nginx

此后,可以在 nginx.conf 中设置 user nginx;,并以非 root 用户运行 master 进程,提升安全性。


第二部分:内部可信自签证书(mkcert 方案)

传统 openssl 生成的自签证书会导致浏览器出现无法消除的安全警告。mkcert 通过本地安装根 CA,实现了完整的信任链,非常适合内部网络环境

1. 安装 mkcert

bash

代码语言:javascript
复制
# 安装依赖
sudo yum install nss-tools -y

# 下载最新版 (建议从 GitHub 获取最新版本号)
wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64

chmod +x mkcert-v1.4.4-linux-amd64
sudo mv mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert

# 验证
mkcert -version

2. 初始化本地 CA 并生成证书

bash

代码语言:javascript
复制
# 将根 CA 安装到系统信任库 (需要 sudo)
mkcert -install

# 生成包含 localhost、127.0.0.1、内网IP、IPv6 的证书
# 请将 192.168.1.100 替换为服务器的真实内网 IP
mkcert localhost 127.0.0.1 192.168.1.100 ::1

# 执行后生成类似 localhost+2.pem 和 localhost+2-key.pem 的文件

3. 配置 Nginx 使用证书

创建证书存放目录并复制文件。

bash

代码语言:javascript
复制
# 创建证书目录
mkdir -p /usr/local/nginx/ssl
# 复制并重命名为规范名称
cp localhost+2.pem /usr/local/nginx/ssl/server.crt
cp localhost+2-key.pem /usr/local/nginx/ssl/server.key

配置 Nginx (/usr/local/nginx/conf/nginx.conf)

以下是一个完整的 HTTPS server 配置示例:

nginx

代码语言:javascript
复制
server {
    listen 443 ssl;
    http2 on;   # 启用 HTTP/2
    server_name 192.168.1.100 localhost;  # 替换为你的实际 IP/域名

    # 证书路径
    ssl_certificate     /usr/local/nginx/ssl/server.crt;
    ssl_certificate_key /usr/local/nginx/ssl/server.key;

    # 现代 SSL 配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 可选: 增强安全性 (HSTS)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        root   html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

4. 重载 Nginx 配置

bash

代码语言:javascript
复制
# 检查配置文件语法
/usr/local/nginx/sbin/nginx -t

# 平滑重载
/usr/local/nginx/sbin/nginx -s reload
# 或使用 systemctl: sudo systemctl reload nginx

第三部分:客户端信任根证书(实现零警告的关键)

要让浏览器完全信任该自签证书,必须在每台访问设备的系统中安装 mkcert 生成的根证书。这是本方案与普通自签证书的本质区别。

1. 导出根证书

在服务器上执行,获取根证书位置:

bash

代码语言:javascript
复制
mkcert -CAROOT
# 输出示例: /home/youruser/.local/share/mkcert
# 进入该目录,找到 rootCA.pem 文件

rootCA.pem 安全分发到客户端(通过内部 Wiki、对象存储、或一次性 HTTP 下载)。

2. 各操作系统安装指南

Windows

  • 重命名 rootCA.pemrootCA.crt,双击 → 安装证书 → 选择 本地计算机将所有证书放入下列存储 → 浏览选择 受信任的根证书颁发机构 → 完成。

macOS

  • 双击 rootCA.pem 打开“钥匙串访问” → 找到证书 → 双击 → 信任使用此证书时 设为 始终信任

Linux (Debian/Ubuntu)

bash

代码语言:javascript
复制
sudo cp rootCA.pem /usr/local/share/ca-certificates/mkcert.crt
sudo update-ca-certificates

iOS / Android

  • 传输文件到手机并打开,按提示安装描述文件。特别注意:iOS 需要在 设置 → 通用 → 关于本机 → 证书信任设置 中手动开启信任开关。

完成上述操作后,浏览器访问 https://你的服务器IP 将不再出现安全警告,地址栏显示安全锁图标。


总结

本文档提供了两套紧密结合的实践:

  1. 源码编译 Nginx:确保了对版本、模块和安装路径的完全控制,结合 setcap 实现了非 root 运行,符合安全基线。
  2. mkcert 自签证书:解决了传统自签证书不受浏览器信任的痛点,通过分发根 CA,在内部环境中实现了“类生产”的 HTTPS 体验。

作为架构师,建议将此流程固化为内部运维文档或自动化脚本(如 Ansible role),以便在服务器批量部署和证书轮换时做到高效、一致。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 第一部分:Nginx 生产级源码安装
    • 1. 环境准备与依赖安装
    • 2. 下载与解压
    • 3. 编译配置(架构关键点)
    • 4. 配置 systemd 服务(标准运维)
    • 5. 权限最小化实践(架构亮点)
  • 第二部分:内部可信自签证书(mkcert 方案)
    • 1. 安装 mkcert
    • 2. 初始化本地 CA 并生成证书
    • 3. 配置 Nginx 使用证书
    • 4. 重载 Nginx 配置
  • 第三部分:客户端信任根证书(实现零警告的关键)
    • 1. 导出根证书
    • 2. 各操作系统安装指南
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档