tomcat - 有时 nginx 无缘无故更改方法(POST -> 01POST 到代理 tomcat)
问题描述
我有一个问题,nginx 返回 501 错误(因为接收到奇怪的方法)或 200 OK 相同的请求。我使用 nginx 1.16.0 作为 Web 服务器,并使用 tomcat 7.0.54。Nginx 反向代理来连接它们。(我也使用java spring。)有时tomcat会收到奇怪的方法。
示例)nginx access.log
10.33.xxx.xxx - [25/Oct/2019:16:21:19 +0900] "POST /ajax/test?ts=1571988079124 HTTP/1.1" [501] 1147 0.006 "https://test.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
tomcat访问.log
127.0.0.1 - - [25/Oct/2019:16:21:19 +0900] "01POST /ajax/test?ts=1571988079124 HTTP/1.1" 501 1147 "https://test.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
如您所见,客户端请求 POST 方法,但 tomcat 接收 01POST 方法。这很奇怪,因为即使它们是相同的 url、参数和请求的用户,它也会随机发生。
我尝试将 proxy_method 设置为请求这样的方法。
nginx.conf
proxy_method $request_method;
但它不起作用。Tomcat仍然收到奇怪的方法......
我希望 nginx(或 tomcat)不会返回 501。
我的配置 - nginx.conf
user irteam;
worker_processes auto;
pid /home1/irteam/apps/nginx/nginx.pid;
events {
worker_connections 16000;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
#default on
server_tokens off;
tcp_nopush on;
tcp_nodelay on;
access_log logs/access.log combined;
error_log logs/error.log error;
sendfile on;
etag on;
keepalive_timeout 25s; #default 75s
keepalive_requests 150; #default 100
client_max_body_size 20M; # default 1M
client_body_timeout 60s; # default 60s
client_body_buffer_size 512k; #default 8k|16k
client_header_timeout 60s; # default 60s
client_header_buffer_size 8k; #default 1k
send_timeout 60s; #default 60s
large_client_header_buffers 20 32k; #default 4 8k
gzip on;
gzip_types text/html application/javascript text/css application/json text/javascript;
gzip_disable "MSIE[4-6]\.";
root /home1/irteam/test;
# upstream
upstream tomcat {
server 127.0.0.1:8080 max_fails=0;
keepalive 30;
}
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_method $request_method;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off; #default on
proxy_request_buffering off; #default on
proxy_buffer_size 32k; #default 4k|8k
proxy_buffers 20 32k; #default 8 4k|8k
proxy_connect_timeout 60s; #default 60s
proxy_read_timeout 60s; #default 60s
proxy_send_timeout 60s; #default 60s
#HTTP Server
server {
listen 80;
server_name test.com;
access_log logs/access.log combined;
error_log logs/error.log error;
rewrite ^((?!http_stub_status).)*$ https://$host$uri permanent;
location / {
allow all;
index index.html index.jsp;
proxy_pass http://tomcat;
}
#gzip static
location ~ .*\.(css|js|js.gz|css.gz)$ {
gzip_vary on;
expires 1w;
}
#static
location ~ .*\.(swf|jpe?g|png|gif|bmp|ico)$ {
expires 1w;
}
location /http_stub_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
#HTTPS Server
server {
listen 443 ssl;
server_name test.com;
access_log logs/access.log combined;
error_log logs/error.log error;
ssl_certificate /home1/irteam/apps/nginx/conf/test.cert.pem;
ssl_certificate_key /home1/irteam/apps/nginx/conf/test.key.pem;
ssl_session_cache shared:SSL:600m;
ssl_session_timeout 5m;
ssl_ciphers EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:RSA+AESGCM:RC4:!LOW:!EXP:!PSK:!KRB5:!MD5:!aNULL:!eNULL:ALL;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
rewrite ^/$ /main permanent;
location / {
allow all;
index index.html index.jsp;
proxy_pass http://tomcat;
}
#gzip static
location ~ .*\.(css|js|js.gz|css.gz)$ {
gzip_vary on;
expires 1w;
}
#static
location ~ .*\.(swf|jpe?g|png|gif|bmp|ico)$ {
expires 1w;
}
location /http_stub_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
}
解决方案
推荐阅读
- flutter - 位于服务器文件夹中的 Flutter Web
- reactjs - .NET Core 3.1 和 ReactJs 16.9.0 - 在 IIS 子文件夹中运行
- typescript - 当您尝试将数组解构为对象时如何自动检测错误?
- scala - 通过使用宏禁止某些情况来“有效的类型安全”
- oracle - Oracle 中的动态位置
- angular - 如何在输入框中显示自定义模板数据-ngx bootstarp typeahead
- python - TypeError: parse() missing 1 required positional argument: 'timestr'
- ruby - 如何修复 redmine 插件(alias_method_chain)
- wordpress - 如何在智能手机上正确展示展示广告?
- glsl - GLSL (WebGL) equivalent for RWTexture2D