您的位置:首页 > 运维架构 > Nginx

Nginx代理非80端口

2014-08-11 17:51 531 查看
出现的问题描述:

Nginx+Tomcat  部署多个后台提供服务:

直接通过后台端口访问一点问题也没有,每个服务器都可以正常使用(当然非80端口)。

当通过Nginx加载项目的时候却不能正确显示页面信息,即看到的页面格式就不正确。经过N多次的Debug都不能解决。

调试了两个小时的后台还是没有效果。转站前台,就发现一个问题,如下所示:

对<link href="<%=basePath %>css/style.css" rel="stylesheet" type="text/css" />的解析不正确。

端口直接访问对basePath的解析是正确无误的:http://127.0.0.1:8081/css/style.css

通过Nginx访问对basePath的解析有误:http://127.0.0.1:80/css/style.css

由此可见Nginx的对<% String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>中的request.getServerPort()解析有误。

于是,又在网上逛了一会,查到答案并解决。下面的红色字体为新增加的,解决了次问题。

server {
        listen       8888;
server_name localhost;

        location /{
             proxy_pass http://interface_pool ;
             proxy_set_header        Host $host:$server_port;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        access_log  logs/nginx.access.log;
}

以下是原文:

版本声明,源文地址:http://kinggoo.com/nginx-not-proxy-80.htm

Nginx通过80端口反向代理到Tomcat实现很简单,通过Jsp的request.getServerPort()获取到的端口号依然是80,而如果Nginx使用非80端口做反响代理时request.getServerPort()获取到的端口号返回依然会是80,这样边无法正确response.sendRedirect

String path = request.getContextPath(); 

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

这样response.sendRedirect会跳转到80端口去

解决办法:

修改proxy.conf获取你把代理的配置写到了nginx内,也可以在其内部修改

proxy_redirect          off;

# nginx非80端口处理 

proxy_set_header        Host $host:$server_port; 

# 获取真实IP 

proxy_set_header        X-Real-IP $remote_addr; 

# 获取代理者的真实ip 

proxy_set_header       X-Forwarded-For   $proxy_add_x_forwarded_for; 

client_max_body_size    10m; 

client_body_buffer_size 128k; 

proxy_connect_timeout   90; 

proxy_send_timeout      90; 

proxy_read_timeout      90; 

proxy_buffer_size       4k; 

proxy_buffers           4 32k; 

proxy_busy_buffers_size 64k; 

proxy_temp_file_write_size 64k;

nginx vhost内虚拟主机代理配置

location ~* "\.(jsp|do)$" { 

        proxy_pass http://kinggoo.ts;

# 使用include引入就可以了 

        include proxy.conf; 

}

参考帮助

Nginx内置变量含义

名称    版本    说明(变量列表来源于文件 ngx_http_variables ) 

$args    1.0.8    请求中的参数; 

$binary_remote_addr    1.0.8    远程地址的二进制表示 

$body_bytes_sent    1.0.8    已发送的消息体字节数 

$content_length    1.0.8    HTTP请求信息里的"Content-Length"; 

$content_type    1.0.8    请求信息里的"Content-Type"; 

$document_root    1.0.8    针对当前请求的根路径设置值; 

$document_uri    1.0.8    与$uri相同; 

$host    1.0.8    请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; 

$hostname    1.0.8     

$http_cookie    1.0.8    cookie 信息 

$http_post    1.0.8     

$http_referer    1.0.8    引用地址 

$http_user_agent    1.0.8    客户端代理信息 

$http_via    1.0.8     最后一个访问服务器的Ip地址。http://www.cnblogs.com/deng02/archive/2009/02/11/1387911.html 

$http_x_forwarded_for    1.0.8     相当于网络访问路径。http://www.cnblogs.com/craig/archive/2008/11/18/1335809.html 

$is_args    1.0.8     

$limit_rate    1.0.8    对连接速率的限制; 

$nginx_version    1.0.8     

$pid    1.0.8     

$query_string    1.0.8    与$args相同; 

$realpath_root    1.0.8     

$remote_addr    1.0.8    客户端地址; 

$remote_port    1.0.8    客户端端口号; 

$remote_user    1.0.8    客户端用户名,认证用; 

$request    1.0.8    用户请求 

$request_body    1.0.8     

$request_body_file    1.0.8    发往后端的本地文件名称 

$request_completion    1.0.8     

$request_filename    1.0.8    当前请求的文件路径名 

$request_method    1.0.8    请求的方法,比如"GET"、"POST"等; 

$request_uri    1.0.8    请求的URI,带参数; 

$scheme    1.0.8     所用的协议,比如http或者是https,比如rewrite^(.+)$$scheme://example.com$1redirect; 

$sent_http_cache_control    1.0.8     

$sent_http_connection    1.0.8     

$sent_http_content_length    1.0.8     

$sent_http_content_type    1.0.8     

$sent_http_keep_alive    1.0.8     

$sent_http_last_modified    1.0.8     

$sent_http_location    1.0.8     

$sent_http_transfer_encoding    1.0.8     

$server_addr    1.0.8    服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费); 

$server_name    1.0.8    请求到达的服务器名; 

$server_port    1.0.8    请求到达的服务器端口号; 

$server_protocol    1.0.8    请求的协议版本,"HTTP/1.0"或"HTTP/1.1"; 

$uri    1.0.8    请求的URI,可能和最初的值有不同,比如经过重定向之类的 

名称    版本    说明(变量列表来源于文件 ngx_http_variables ) 

$args    1.0.8    请求中的参数; 

$binary_remote_addr    1.0.8    远程地址的二进制表示 

$body_bytes_sent    1.0.8    已发送的消息体字节数 

$content_length    1.0.8    HTTP请求信息里的"Content-Length"; 

$content_type    1.0.8    请求信息里的"Content-Type"; 

$document_root    1.0.8    针对当前请求的根路径设置值; 

$document_uri    1.0.8    与$uri相同; 

$host    1.0.8    请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; 

$hostname    1.0.8     

$http_cookie    1.0.8    cookie 信息 

$http_post    1.0.8     

$http_referer    1.0.8    引用地址 

$http_user_agent    1.0.8    客户端代理信息 

$http_via    1.0.8     最后一个访问服务器的Ip地址。http://www.cnblogs.com/deng02/archive/2009/02/11/1387911.html 

$http_x_forwarded_for    1.0.8     相当于网络访问路径。http://www.cnblogs.com/craig/archive/2008/11/18/1335809.html 

$is_args    1.0.8     

$limit_rate    1.0.8    对连接速率的限制; 

$nginx_version    1.0.8     

$pid    1.0.8     

$query_string    1.0.8    与$args相同; 

$realpath_root    1.0.8     

$remote_addr    1.0.8    客户端地址; 

$remote_port    1.0.8    客户端端口号; 

$remote_user    1.0.8    客户端用户名,认证用; 

$request    1.0.8    用户请求 

$request_body    1.0.8     

$request_body_file    1.0.8    发往后端的本地文件名称 

$request_completion    1.0.8     

$request_filename    1.0.8    当前请求的文件路径名 

$request_method    1.0.8    请求的方法,比如"GET"、"POST"等; 

$request_uri    1.0.8    请求的URI,带参数; 

$scheme    1.0.8     所用的协议,比如http或者是https,比如rewrite^(.+)$$scheme://example.com$1redirect; 

$sent_http_cache_control    1.0.8     

$sent_http_connection    1.0.8     

$sent_http_content_length    1.0.8     

$sent_http_content_type    1.0.8     

$sent_http_keep_alive    1.0.8     

$sent_http_last_modified    1.0.8     

$sent_http_location    1.0.8     

$sent_http_transfer_encoding    1.0.8     

$server_addr    1.0.8    服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费); 

$server_name    1.0.8    请求到达的服务器名; 

$server_port    1.0.8    请求到达的服务器端口号; 

$server_protocol    1.0.8    请求的协议版本,"HTTP/1.0"或"HTTP/1.1"; 

$uri    1.0.8    请求的URI,可能和最初的值有不同,比如经过重定向之类的 

名称    版本    说明(变量列表来源于文件 ngx_http_variables ) 

$args    1.0.8    请求中的参数; 

$binary_remote_addr    1.0.8    远程地址的二进制表示 

$body_bytes_sent    1.0.8    已发送的消息体字节数 

$content_length    1.0.8    HTTP请求信息里的"Content-Length"; 

$content_type    1.0.8    请求信息里的"Content-Type"; 

$document_root    1.0.8    针对当前请求的根路径设置值; 

$document_uri    1.0.8    与$uri相同; 

$host    1.0.8    请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; 

$hostname    1.0.8     

$http_cookie    1.0.8    cookie 信息 

$http_post    1.0.8     

$http_referer    1.0.8    引用地址 

$http_user_agent    1.0.8    客户端代理信息 

$http_via    1.0.8     最后一个访问服务器的Ip地址。http://www.cnblogs.com/deng02/archive/2009/02/11/1387911.html 

$http_x_forwarded_for    1.0.8     相当于网络访问路径。http://www.cnblogs.com/craig/archive/2008/11/18/1335809.html 

$is_args    1.0.8     

$limit_rate    1.0.8    对连接速率的限制; 

$nginx_version    1.0.8     

$pid    1.0.8     

$query_string    1.0.8    与$args相同; 

$realpath_root    1.0.8     

$remote_addr    1.0.8    客户端地址; 

$remote_port    1.0.8    客户端端口号; 

$remote_user    1.0.8    客户端用户名,认证用; 

$request    1.0.8    用户请求 

$request_body    1.0.8     

$request_body_file    1.0.8    发往后端的本地文件名称 

$request_completion    1.0.8     

$request_filename    1.0.8    当前请求的文件路径名 

$request_method    1.0.8    请求的方法,比如"GET"、"POST"等; 

$request_uri    1.0.8    请求的URI,带参数; 

$scheme    1.0.8     所用的协议,比如http或者是https,比如rewrite^(.+)$$scheme://example.com$1redirect; 

$sent_http_cache_control    1.0.8     

$sent_http_connection    1.0.8     

$sent_http_content_length    1.0.8     

$sent_http_content_type    1.0.8     

$sent_http_keep_alive    1.0.8     

$sent_http_last_modified    1.0.8     

$sent_http_location    1.0.8     

$sent_http_transfer_encoding    1.0.8     

$server_addr    1.0.8    服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费); 

$server_name    1.0.8    请求到达的服务器名; 

$server_port    1.0.8    请求到达的服务器端口号; 

$server_protocol    1.0.8    请求的协议版本,"HTTP/1.0"或"HTTP/1.1"; 

$uri    1.0.8    请求的URI,可能和最初的值有不同,比如经过重定向之类的 名称 版本 说明(变量列表来源于文件 ngx_http_variables ) 

$args 1.0.8 请求中的参数; 

$binary_remote_addr 1.0.8 远程地址的二进制表示 

$body_bytes_sent 1.0.8 已发送的消息体字节数 

$content_length 1.0.8 HTTP请求信息里的"Content-Length"; 

$content_type 1.0.8 请求信息里的"Content-Type"; 

$document_root 1.0.8 针对当前请求的根路径设置值; 

$document_uri 1.0.8 与$uri相同; 

$host 1.0.8 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; 

$hostname 1.0.8  

$http_cookie 1.0.8 cookie 信息 

$http_post 1.0.8  

$http_referer 1.0.8 引用地址 

$http_user_agent 1.0.8 客户端代理信息 

$http_via 1.0.8 最后一个访问服务器的Ip地址。http://www.cnblogs.com/deng02/archive/2009/02/11/1387911.html 

$http_x_forwarded_for 1.0.8 相当于网络访问路径。http://www.cnblogs.com/craig/archive/2008/11/18/1335809.html 

$is_args 1.0.8  

$limit_rate 1.0.8 对连接速率的限制; 

$nginx_version 1.0.8  

$pid 1.0.8  

$query_string 1.0.8 与$args相同; 

$realpath_root 1.0.8  

$remote_addr 1.0.8 客户端地址; 

$remote_port 1.0.8 客户端端口号; 

$remote_user 1.0.8 客户端用户名,认证用; 

$request 1.0.8 用户请求 

$request_body 1.0.8  

$request_body_file 1.0.8 发往后端的本地文件名称 

$request_completion 1.0.8  

$request_filename 1.0.8 当前请求的文件路径名 

$request_method 1.0.8 请求的方法,比如"GET"、"POST"等; 

$request_uri 1.0.8 请求的URI,带参数; 

$scheme 1.0.8 所用的协议,比如http或者是https,比如rewrite^(.+)$$scheme://example.com$1redirect; 

$sent_http_cache_control 1.0.8  

$sent_http_connection 1.0.8  

$sent_http_content_length 1.0.8  

$sent_http_content_type 1.0.8  

$sent_http_keep_alive 1.0.8  

$sent_http_last_modified 1.0.8  

$sent_http_location 1.0.8  

$sent_http_transfer_encoding 1.0.8  

$server_addr 1.0.8 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费); 

$server_name 1.0.8 请求到达的服务器名; 

$server_port 1.0.8 请求到达的服务器端口号; 

$server_protocol 1.0.8 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"; 

$uri 1.0.8 请求的URI,可能和最初的值有不同,比如经过重定向之类的

nginx内置变量转自:http://blog.sina.com.cn/s/blog_644eb9350101cuzm.html


版权声明:

转载原创文章请注明,文章出处:http://kinggoo.com

原文地址:http://kinggoo.com/nginx-not-proxy-80.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息