配置了反向代理后,圖片資源或者js文件只加載到一半
查看日志,提示權(quán)限不足,即使使用了root來啟動(dòng)nginx 也不行。
資源所在的目錄不屬于root。
解決方法:
vim conf/nginx.conf
添加下面一行語句即可
user {資源目錄所屬的用戶}
資源mine類型問題

Snip20180301_33.png
http://blog.csdn.net/justnow_/article/details/52628022
根據(jù)版本來進(jìn)行反向代理配置
對 客戶端URL帶有版本號的請求 進(jìn)行反向代理,比如
/v1.0.0/XXX/AAA
先設(shè)置upstream,
upstream serverXXX{
server http://localhost:8080
}
后設(shè)置 location, ###請注意url最后面的 斜杠###
server {
listen 8080;
server_name 172.16.3.188;
client_max_body_size 5M;
location /v1.5.0/ {
proxy_pass http://tomcat_8080/;
proxy_set_header Host $host:$server_port;
}
}
效果: 將v1.5.0后面的請求url 轉(zhuǎn)發(fā)給 tomcat_8080后面
例如輸入
http://xxx/v1.5.0/aaa/bbb
將會將 v1.5.0/后面的路徑 拼接到tomcat_8080后面,實(shí)際請求路徑為:
http://tomcat_8080/aaa/bbb
提示:如果 proxy_pass http://tomcat_8080 后面不加斜杠
那會把整個(gè)請求url /v1.5.0/aaa/bbb 拼接到tomcat_8080后面,結(jié)果為
<pre>
http://tomcat_8080/v1.5.0/aaa/bbb
這個(gè)請求會報(bào)404錯(cuò)誤
</pre>
一般來說,服務(wù)器除了接收帶有版本號的請求url 以外,還要接收x`
Nginx轉(zhuǎn)發(fā)tomcat,導(dǎo)致tomcat取值有問題
Nginx+Tomcat+SSL
實(shí)際上,大規(guī)模的網(wǎng)站都有很多臺Web服務(wù)器和應(yīng)用服務(wù)器組成,用戶的請求可能是經(jīng)由 Varnish、HAProxy、Nginx之后才到應(yīng)用服務(wù)器,中間有好幾層。而中小規(guī)模的典型部署常見的是 Nginx+Tomcat 這種兩層配置,而Tomcat 會多于一臺,Nginx 作為靜態(tài)文件處理和負(fù)載均衡。
如果Nginx作為前端代理的話,則Tomcat根本不需要自己處理 https,全是Nginx處理的。用戶首先和Nginx建立連接,完成SSL握手,而后Nginx 作為代理以 http 協(xié)議將請求轉(zhuǎn)給 tomcat 處理,Nginx再把 tomcat 的輸出通過SSL 加密發(fā)回給用戶,這中間是透明的,Tomcat只是在處理 http 請求而已。因此,這種情況下不需要配置 Tomcat 的SSL,只需要配置 Nginx 的SSL 和 Proxy。
在代理模式下,Tomcat 如何識別用戶的直接請求(URL、IP、https還是http )?
在透明代理下,如果不做任何配置Tomcat 認(rèn)為所有的請求都是 Nginx 發(fā)出來的,這樣會導(dǎo)致如下的錯(cuò)誤結(jié)果:
request.getScheme() //總是 http,而不是實(shí)際的http或https
request.isSecure() //總是false(因?yàn)榭偸莌ttp)
request.getRemoteAddr() //總是 nginx 請求的 IP,而不是用戶的IP
request.getRequestURL() //總是 nginx 請求的URL 而不是用戶實(shí)際請求的 URL
request.getServerName //總是nginx請求的ip
request.getServerPort //總是nginx請求的端口
response.sendRedirect( 相對url ) //總是重定向到 http 上 (因?yàn)檎J(rèn)為當(dāng)前是 http 請求)
如果程序中把這些當(dāng)實(shí)際用戶請求做處理就有問題了。解決方法很簡單,只需要分別配置一下 Nginx 和 Tomcat 就好了,而不用改程序。
配置 Nginx 的轉(zhuǎn)發(fā)選項(xiàng):
proxy_set_header Host $host; //解決getRequestURL、getServerName、getServerPort
//如果nginx是80服務(wù),上面就夠,代表默認(rèn)servlet_port是80;否則需要Host $host:$server_port,不配置servlet_port會導(dǎo)致丟失端口
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; //解決getScheme,isSecure,sendRedirect
配置Tomcat server.xml 的 Engine 模塊下配置一個(gè) Value:
< Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https" />
配置雙方的 X-Forwarded-Proto 就是為了正確地識別實(shí)際用戶發(fā)出的協(xié)議是 http 還是 https。X-Forwarded-For 是為了獲得實(shí)際用戶的 IP。
這樣以上5項(xiàng)測試就都變?yōu)檎_的結(jié)果了,就像用戶在直接訪問 Tomcat 一樣。
是否會影響這些?
路徑:resin/webapps/my_proj/test/request.jsp
http://localhost:8080/my_proj/test/request.jsp?***
request.getRequestURI() /my_proj/test/request.jsp
request.getRequestURL() http://localhost:8080/my_proj/test/request.jsp
request.getContextPath() /my_proj 帶/WEB-INF的目錄地址
request.getServletPath() /test/request.jsp
貌似request.getRequestURI() 為request.getContextPath()+request.getServletPath()
http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html