一、安装和编译证书模块
[root@master nginx]# wget https://nginx.org/download/nginx-1.25.3.tar.gz
[root@master nginx]# tar -zxvf nginx-1.25.3.tar.gz
[root@master nginx]# cd nginx-1.25.3
[root@master nginx]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream --with-stream_ssl_module
[root@master nginx]# make && make install
#查看编译是否成功
nginx -V
二、上传证书到指定的路径下
3.1、上传证书到/usr/local/nginx/conf/ssl目录下
#创建存放证书的路径方便管理
mkdir -p /usr/local/nginx/conf/ssl
#上传证书
3.2、查看证书的详情
openssl x509 -in /usr/local/nginx/conf/ssl/gateway.crt -text -noout
三、Nginx配置HTTPS和TCPS
(一)、HTTPS配置
4.1、HTTP配置
server {
listen 8888;
server_name 192.168.72.130;
location / {
root /opt/sumscope;
}
}
4.2、HTTPS配置
#编辑server添加如下内容
server {
listen 8888 ssl;
ssl_certificate /usr/local/nginx/conf/ssl/gateway.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/gateway.key;
server_name 192.168.72.130;
location / {
root /opt/sumscope;
}
}
#执行reload
nginx -s reload
继续以HTTP访问出现400报错
因为配置了HTTPS通过HTTP访问就会报错,要想解决HTTP访问自动跳转到HTTPS,需要将HTTP请求重定向到HTTPS。
400报错原因:
当使用 Nginx 时遇到 400 错误(Bad Request),意味着客户端发送的请求存在问题,Nginx 无法理解该请求。下面为你详细分析可能的原因:
请求头相关问题
- 请求头过长:如果客户端发送的请求头包含过多的信息,超过了 Nginx 配置中允许的最大请求头长度,Nginx 就会返回 400 错误。可以通过调整
http
块或server
块中的large_client_header_buffers
指令来解决,示例如下:
http {
large_client_header_buffers 4 8k;
...
}
上述配置将最大请求头缓冲区数量设置为 4,每个缓冲区大小为 8KB。
- 请求头格式错误:若请求头的格式不符合 HTTP 协议规范,例如缺少必要的字段、字段值格式错误或包含非法字符等,Nginx 会拒绝该请求。比如,请求头中的
Host
字段缺失或格式错误,就可能导致 400 错误。 - 请求头编码问题:如果请求头使用了不支持的字符编码,Nginx 可能无法正确解析请求,从而返回 400 错误。
请求 URI 相关问题
- URI 过长:当客户端发送的请求 URI 长度超过 Nginx 配置中允许的最大值时,会触发 400 错误。可以通过修改
http
块或server
块中的client_header_buffer_size
和large_client_header_buffers
指令来调整最大 URI 长度。 - URI 包含非法字符:请求 URI 中包含不允许的字符,如未经过正确编码的特殊字符,可能会导致 Nginx 无法解析请求。例如,在 URI 中直接使用空格而未进行编码,就会引发问题。
客户端或代理问题
- 客户端软件故障:某些客户端软件(如浏览器、爬虫程序等)可能存在漏洞或配置错误,导致发送的请求不符合 HTTP 协议规范。例如,浏览器插件可能会修改请求头,从而引发 400 错误。
- 代理服务器配置错误:如果使用了代理服务器,代理服务器的配置错误可能会影响请求的正常转发。例如,代理服务器可能会修改请求头或 URI,导致请求在到达 Nginx 时出现问题。
其他问题
- SSL/TLS 握手问题:在使用 HTTPS 协议时,SSL/TLS 握手过程中出现错误,如客户端和服务器支持的 SSL/TLS 版本不兼容、加密算法不匹配等,可能会导致 Nginx 返回 400 错误。
- 服务器过载:当服务器负载过高时,可能无法及时处理客户端的请求,从而返回 400 错误。可以通过优化服务器配置、增加硬件资源或使用负载均衡器来解决。
4.3、配置将HTTP请求重定向到HTTPS
#HTTPS配置
server {
listen 443 ssl;
ssl_certificate /usr/local/nginx/conf/ssl/gateway.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/gateway.key;
server_name 192.168.72.130;
location / {
root /opt/sumscope;
}
}
#将HTTP请求重定向到HTTPS
server {
listen 80;
server_name 192.168.72.130;
return 301 https://$server_name$request_uri;
}
#执行reload
nginx -s reload
4.3.1、访问测试
浏览器输入:192.168.72.130
跳转到如下页面
(二)、TCPS配置
分别配置没有证书(TCP)和有证书(TCPS)场景
#负载均衡场景1:配置证书
stream{
upstream gateway{
#hash $remote_addr consistent;
server 192.168.72.130:2000;
server 192.168.72.131:2000 backup;
}
server {
listen 444 ssl;
proxy_pass gateway;
ssl_certificate /usr/local/nginx/conf/ssl/gateway.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/gateway.key;
proxy_connect_timeout 10s;
proxy_timeout 300s;
}
#负载均衡场景2:没有配置证书
upstream stctcp{
server 192.168.72.130:2000;
server 192.168.72.131:2000 backup;
}
server {
listen 9092;
proxy_connect_timeout 10s;
proxy_timeout 300s;
proxy_pass stctcp;
}
}