nginx部署完成后訪問首頁無問題,點擊跳轉進入其他頁面時而無法打開


最近在做項目時公司有個需求,需要從外網訪問內網,這不就是典型的反向代理么,然后就想到了nginx,一款很優秀的高性能應用代理軟件,你值得學習和擁有。

nginx的安裝和部署這里就不介紹了,網上大把的例子。然后我也是按照網上的例子安裝和部署的,然后部署成功了,訪問首頁也沒問題。並且大家都知道http默認端口是80,我在nginx服務器上使用80端口的時候也沒問題,從首頁點擊進入其他頁面跳轉都沒問題(因為nginx在設置代理地址的時候沒有設置端口,所以默認就是80端口了),這是在測試環境。

然而當我在生產部署nginx服務的時候,發現80端口已經被占用了,無法再使用80端口來給我們的nginx代理使用,所以不得不換成其他的端口,比如:8002,然后我就換成了8002端口,然后就配置了,具體配置如下:

nginx.conf配置:
#user www www;
worker_processes 4;
worker_cpu_affinity 00000001 00000010 00000100 00001000;
#pid /tpsys/nginx/nginx/logs/nginx.pid
worker_rlimit_nofile 102400;

events
{
use epoll;
worker_connections 102400;
}

http
{
include mime.types;
default_type application/octet-stream;
fastcgi_intercept_errors on;
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
client_body_buffer_size 512k;

proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

log_format main ' $remote_addr - $host - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';

#upstream web1 {
# server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
# server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
#}

#upstream web2 {
# server 127.0.0.1:8090 weight=1 max_fails=2 fail_timeout=30s;
# server 127.0.0.1:8091 weight=1 max_fails=2 fail_timeout=30s;
#}
include vhosts.conf;
}

vhost.conf配置:
server {
listen 8002;
server_name localhost;

#rewrite ^/(.*)$ http://192.168.81.135:8002/$1 permanent;

index index.jsp index.html index.htm;
root / ;

location /
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.136.1:8080;
}

# location ~ .*\.(php|jsp|cgi|shtml)?$
# {
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_pass http://jvm_web2;
# }

location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /servletClient;
expires 30d;
}

access_log /tpsys/nginx/nginx/logs/access.log main;
error_log /tpsys/nginx/nginx/logs/error.log crit;
}

為了方便查看和理解,我的nginx.conf拆分成了以上兩個,分別為:nginx.confvhost.conf

然后在做了以上配置后訪問nginx服務首頁時沒問題,可以正常訪問,頁面如下:

然后點擊“登錄”按鈕,結果如下:

 大家可以很清楚的看到原來的端口發生了變化,8002端口不見了,然而網頁也訪問不了了,是不是很奇怪呢?

我只是做了一個小小的測試,我的servlet的代碼如下:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String userName = req.getParameter("userName");
// base64編碼處理
System.out.println("得到的用戶名為:" + userName);
resp.setContentType("text/html;charset=utf-8");
// 重定向
resp.sendRedirect("/servletClient/index.jsp");

// 轉發
// ServletContext sc = getServletContext();
// RequestDispatcher rd = null;
// req.setAttribute("userName", userName);
// rd = sc.getRequestDispatcher("/index.jsp");
// rd.forward(req, resp);
}

以上為重定向測試!

 然而當我把重定向的代碼注釋掉,改用轉發的方式,結果還會是這樣么?我們會發現結果如下:

第一個頁面是一樣的,就不重復貼圖了。

我們會發現轉發的時候無問題,而重定向的時候問題很大,頁面都顯示不出來了,報404。

然后我們就會想,難道nginx不支持重定向嗎?答案當然不是。

關鍵是要找到問題的症結在哪里,你想想是在頁面進行跳轉的時候地址欄發生了變化,那么肯定是nginx在重定向的時候出了問題,那么問題出在哪里呢?

我們找到nginx.conf最核心的配置server{},我這里是vhost.conf,如下:

然后會發現代理設置在location里面設置的,然后看到有一段是:proxy_set_header Host  $host;

了解nginx的同學應該都知道$host指的是當前主機的ip地址,這個我在日志中也有打印,大家可以注意看下。

 然后發現這個$host后面沒有端口,那這是什么意思呢?因為使用了http的默認端口80,所以不加也不會報錯(原則是你外網請求的端口也必須是80才行),

但當你請求的端口不是80時,那么問題就來了。比如你請求的是8002,那么經過這個配置一設置,那么你的端口是不是就變成80了,而我們在瀏覽器中看不到:80是因為瀏覽器將其做了隱藏。

所以要想進行正確的請求就必須修改這個配置,將上面那段修改成proxy_set_header Host  $host:8002;,如下:

以上端口根據你的實際情況而定。

然后你再試下會發現問題解決。

 

總結:

 1.你肯定會問為什么轉發沒問題,而重定向就會有問題了呢?

答:這是轉發和重定向的性質決定的,因為轉發是一次請求,由服務端進行的處理。而重定向是客戶端進行的處理,相當於發起了兩次請求,所以第二次請求的時候url就發生了變化。

2.在proxy_set_header Host  $host;后面加上端口號會不會對轉發請求造成影響?

答:不會,自己也可以多測試。

最后附上一篇重定向和轉發的區別的文章:https://blog.csdn.net/meiyalei/article/details/2129120


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM