Nginx开启SSL设置

       要同时安装 --with-http_ssl_module 和 --with-http_v2_module 这两个模块,只需要在运行 ./configure 脚本时,将这两个参数用空格隔开,一起放在命令行后面即可。这两个模块通常是一起使用的,因为 http2 协议在现代浏览器中强制要求使用 HTTPS,而 http_ssl_module 正是用来提供 HTTPS 支持的。


详细步骤

假设您正在重新编译 Nginx,并且已经知道了您现有的编译参数。

第 1 步:找到您的 Nginx 源代码目录

进入您当初解压 Nginx 源码的那个文件夹。
 
bash
cd /path/to/your/nginx-1.28.0

第 2 步:查看您当前的编译参数

运行以下命令,找到 configure arguments: 后面的所有内容,并完整复制它们。
 
bash
/usr/local/nginx/sbin/nginx -V
 

第 3 步:运行 ./configure 并添加两个模块参数

将您复制的旧参数粘贴到 ./configure 后面,然后在末尾添加 --with-http_ssl_module --with-http_v2_module
 
命令格式如下:
 
bash
./configure [您复制的所有旧参数] --with-http_ssl_module --with-http_v2_module
具体示例:
 
假设您原来的编译参数只有 --prefix=/usr/local/nginx,那么新的命令就是:
 
bash
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module
 
重要提示:
 
  • 顺序不重要--with-http_ssl_module 和 --with-http_v2_module 的顺序可以互换。
  • 依赖关系http_v2_module 依赖于 OpenSSL 库。如果您的系统没有安装 OpenSSL 开发库,./configure 会报错。
    • 在 Ubuntu/Debian 上安装依赖:
      bash
      sudo apt update
      sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
      
    • 在 CentOS/RHEL 上安装依赖:
      bash
      sudo yum groupinstall "Development Tools"
      sudo yum install pcre-devel zlib-devel openssl-devel
      

第 4 步:编译和安装

  1. 编译
    bash
    make
    
  2. 停止旧的 Nginx 服务
    bash
    sudo /usr/local/nginx/sbin/nginx -s stop
    
     
  3. 替换二进制文件(如果是升级,不要运行 make install,而是手动替换):
    bash
     
    sudo cp objs/nginx /usr/local/nginx/sbin/nginx
    
     
    (如果是全新安装,可以直接运行 sudo make install

第 5 步:验证并重启

  1. 验证新模块是否已成功添加
    bash
    /usr/local/nginx/sbin/nginx -V
    
    在输出的配置参数中,您应该能同时看到 --with-http_ssl_module 和 --with-http_v2_module
  2. 启动 Nginx
    bash
    sudo /usr/local/nginx/sbin/nginx
    
现在,Nginx 已经同时支持 HTTPS 和 HTTP/2 了,可以在配置文件中安全地使用 listen 443 ssl; http2 on; 了。
 
让 Nginx 将所有 HTTP 请求(端口 80)重定向到 HTTPS(端口 443)是一个非常常见且重要的安全配置。这样可以确保用户始终通过加密连接访问您的网站。
 
以下是实现此功能的几种常用方法,从最简单推荐的到更复杂的场景。

方法一:使用 return 301 (推荐,最简单高效)

这是最常用、最直接且性能最高的方法。它通过一个 server 块专门监听 80 端口,并将所有请求永久重定向(301)到对应的 HTTPS 地址。
 
  1. 打开 Nginx 配置文件
    bash
    sudo vim /usr/local/nginx/conf/nginx.conf  # 或者您的站点配置文件
    
  2. 添加或修改 server 块
     
    在您的配置文件中,添加一个新的 server 块来处理 HTTP 请求。
    nginx
     
    # --- HTTP 到 HTTPS 重定向配置 ---
    # 这个 server 块专门用来监听所有 80 端口的请求
    server {
        listen 80;
        # 替换成您自己的域名,如果有多个用空格隔开
        server_name yourdomain.com www.yourdomain.com;
    
        # 核心指令:将所有请求永久重定向到 HTTPS
        # $host 变量会自动替换为请求的域名
        # $request_uri 变量会保留完整的 URL 路径和参数
        return 301 https://$host$request_uri;
    }
    
    # --- 您已有的 HTTPS 配置 ---
    # 这个 server 块处理 443 端口的加密请求
    server {
        listen 443 ssl http2;
        server_name yourdomain.com www.yourdomain.com;
    
        # SSL 证书配置 (路径请根据实际情况修改)
        ssl_certificate /usr/local/nginx/ssl/yourdomain.com.pem;
        ssl_certificate_key /usr/local/nginx/ssl/yourdomain.com.key;
    
        # ... 其他 HTTPS 相关配置 ...
    }
    
优点
  • 高效return 指令在 Nginx 配置解析的早期阶段执行,性能开销极小。
  • 清晰:意图明确,配置简单,易于理解和维护。

方法二:使用 rewrite 指令

rewrite 指令也可以实现重定向,但它功能更强大,适用于更复杂的 URL 重写场景。对于简单的 HTTP 到 HTTPS 重定向,return 是更好的选择。
 
nginx
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    # 使用 rewrite 进行重定向
    # ^(.*)$ 是一个正则表达式,匹配整个 URL 路径
    # permanent 表示 301 永久重定向
    rewrite ^(.*)$ https://$host$1 permanent;
}
 
对比 return 和 rewrite
  • 性能return 通常比 rewrite 更快,因为它不涉及正则表达式的解析。
  • 可读性return 的意图比 rewrite 更直观。
  • 推荐:对于纯重定向,始终优先使用 return

方法三:重定向所有域名(捕获所有未匹配的流量)

如果您希望服务器上所有未被其他 server 块处理的域名都强制 HTTPS,可以使用 _ 作为 server_name
nginx
server {
    listen 80 default_server;
    # _ 是一个特殊值,表示“匹配所有未匹配到其他 server_name 的请求”
    server_name _;

    return 301 https://$host$request_uri;
}
 
注意default_server 标志表示这是处理该端口上所有未匹配请求的默认服务器。

方法四:在单个 server 块中处理(不推荐)

您也可以在一个 server 块中同时监听 80 和 443 端口,然后使用 if 指令来判断是否为 HTTP 请求并进行重定向。
 
nginx
server {
    # 同时监听 80 和 443 端口
    listen 80;
    listen 443 ssl http2;

    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate /usr/local/nginx/ssl/yourdomain.com.pem;
    ssl_certificate_key /usr/local/nginx/ssl/yourdomain.com.key;

    # 使用 if 判断协议
    # $scheme 变量会返回 "http" 或 "https"
    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }

    # ... 其他配置 ...
}
 
为什么不推荐?
  • if 指令的复杂性:在 Nginx 的 server 块中使用 if 可能会触发一些非预期的行为,被称为 "if is evil"。虽然在此特定场景下通常是安全的,但养成使用 if 的习惯可能会在未来导致问题。
  • 配置不清晰:将 HTTP 和 HTTPS 的逻辑分离到两个独立的 server 块中,代码结构更清晰,更易于维护。

操作步骤总结

  1. 编辑 Nginx 配置文件
  2. 添加一个新的 server 块listen 80;,并使用 return 301 https://$host$request_uri;
  3. 保存文件
  4. 检查配置语法sudo nginx -t
  5. 平滑重启 Nginxsudo nginx -s reload
完成以上步骤后,当用户访问 http://yourdomain.com 或 http://www.yourdomain.com 时,浏览器会自动跳转到 https:// 版本的地址。

额外建议:添加 HSTS 头

为了进一步增强安全性,您可以在您的 HTTPS server 块中添加 Strict-Transport-Security (HSTS) 响应头。
nginx
# 在您的 HTTPS server 块中添加
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
作用
 
告诉浏览器,在未来 1 年(31536000 秒)内,只要访问这个域名或其子域名,都应该直接使用 HTTPS,而无需先尝试 HTTP。这可以有效防止降级攻击,并加快第二次访问的速度。
相关新闻