NGINX配置:仅将443端口流量转发至反向代理的方法
问题描述
我配置了NGINX同时监听80和443端口,之前所有端口流量都能正常转发到7000端口由ASP.NET处理。后来我注释了部分配置,想让HTTP 80端口的流量不再转发到7000,而是由NGINX直接提供/var/www/somedomain.com目录下的文件,但访问http://somedomain.com/.well-known/acme-challenge/test.html时一直返回404错误,怀疑请求还是被转发到了上游服务器。另外发现HTTP请求会自动重定向到HTTPS,这可能也是导致404的原因之一。
现有NGINX配置如下:
upstream somedomain.com { server 127.0.0.1:7000; } server { server_name somedomain.com; listen [::]:443 ssl default_server; listen 443 ssl default_server; ssl_certificate /etc/letsencrypt/live/somedomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/somedomain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; gzip on; gzip_types text/plain application/xml; gzip_proxied no-cache no-store private expired auth; gzip_min_length 1000; gunzip on; location / { proxy_pass http://somedomain.com; } } server { #if ($host = somedomain.com) #{ # return 301 https://$host$request_uri; #} listen 80; listen [::]:80; server_name somedomain.com; #return 404; root /var/www/somedomain.com; location / { } }
注:test.html已经放在正确路径,/var/www/somedomain.com目录下同时有ASP.NET文件。
解决方案
1. 修复80端口的静态文件处理逻辑
当前80端口的location /块是空的,NGINX不会自动处理静态文件请求,必须明确添加try_files指令,让NGINX优先查找本地文件:
server { listen 80; listen [::]:80; server_name somedomain.com; root /var/www/somedomain.com; location / { try_files $uri $uri/ =404; } # 单独配置ACME验证路径,避免其他规则干扰(可选但更稳妥) location /.well-known/acme-challenge/ { try_files $uri =404; } }
添加后,NGINX会先尝试匹配请求的文件路径,找到就直接返回,不会转发到上游服务器。单独配置/.well-known/acme-challenge/可以确保ACME验证请求的优先级最高,不会被其他规则影响。
2. 关闭自动HTTPS重定向
HTTP自动跳转到HTTPS通常有两个来源,逐一排查:
- NGINX配置文件:检查
/etc/letsencrypt/options-ssl-nginx.conf文件,里面可能包含强制HTTPS的重定向规则,如果有类似return 301 https://$host$request_uri;的内容,要么注释掉,要么在80端口的server块中添加指令覆盖。 - ASP.NET应用设置:因为
/var/www/somedomain.com下有ASP.NET文件,可能应用本身开启了HSTS或者强制HTTPS重定向。可以临时移走该目录下的web.config测试,如果移走后不再重定向,说明是应用层面的设置,需要修改ASP.NET的配置(比如web.config或launchSettings.json)关闭强制HTTPS。
3. 验证配置并重启NGINX
修改完配置后,先执行nginx -t检查语法是否正确,确认没问题后执行systemctl reload nginx(不同系统命令可能略有差异)让配置生效。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

