要同时安装 --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
- 在 Ubuntu/Debian 上安装依赖:
第 4 步:编译和安装
- 编译:
bash
make - 停止旧的 Nginx 服务:
bash
sudo /usr/local/nginx/sbin/nginx -s stop - 替换二进制文件(如果是升级,不要运行
make install,而是手动替换):bashsudo cp objs/nginx /usr/local/nginx/sbin/nginx(如果是全新安装,可以直接运行sudo make install)
第 5 步:验证并重启
-
验证新模块是否已成功添加:bash
/usr/local/nginx/sbin/nginx -V在输出的配置参数中,您应该能同时看到--with-http_ssl_module和--with-http_v2_module。 -
启动 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 地址。-
打开 Nginx 配置文件:bash
sudo vim /usr/local/nginx/conf/nginx.conf # 或者您的站点配置文件 -
添加或修改
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可能会触发一些非预期的行为,被称为 "ifis evil"。虽然在此特定场景下通常是安全的,但养成使用if的习惯可能会在未来导致问题。- 配置不清晰:将 HTTP 和 HTTPS 的逻辑分离到两个独立的
server块中,代码结构更清晰,更易于维护。
操作步骤总结
- 编辑 Nginx 配置文件。
- 添加一个新的
server块,listen 80;,并使用return 301 https://$host$request_uri;。 - 保存文件。
- 检查配置语法:
sudo nginx -t - 平滑重启 Nginx:
sudo 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。这可以有效防止降级攻击,并加快第二次访问的速度。