供參考參考參考參考參考參考參考參考參考參考參考參考參考參考參考參考
花了整整一個禮拜時間,現在可以收官了,一來自己確實呆的可以,二來百度查到的資料千篇一律毫無價值,對那些作者強烈鄙視之。
再次強烈鄙視。
我的在官網下載,在windows下面跑。綠色,點擊nginx.exe開始運行。進入conf目錄打開nginx.conf文件編輯服務器所有的配置。非常簡單。
linux環境還沒跑出來。因爲很簡單的表達式都不能識別。可能需要重新安裝nginx和pcre什麼。
下面都是在windows跑的。版本是1.4.1
對於java應用nginx一般僅僅用作負載均衡,緩存會交給其他專用緩存服務器。nginx自帶的緩存機制,可以看看這篇文章,據說完全可以替代squid
http://server.51cto.com/sCollege-189132.htm
nginx還有一個fastcgi模塊,我的理解是,java應用用不着這個模塊,php可以用,fastcgi是一種web服務器,用來處理頁面,類似servlet等等,jsp可以交給servlet處理而交給fastcgi就難說了。
相關文章:
http://www.iteye.com/topic/20751
http://blog.sina.com.cn/s/blog_638e029a0100qu95.html
如果僅僅用作負載均衡,那麼nginx.conf的配置就尤其簡單了。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
upstream tomcat_server {
server localhost:18002;
server localhost:18001;
#ip_hash;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat_server;
proxy_connect_timeout 1s;
proxy_next_upstream error timeout invalid_header http_404 http_502 http_503 http_504 http_500;
}
}
}
這一段配置意思是:server_name是請求地址,location表示對各種請求地址分別處理,可以有很多個location和很多個server。
location /表示匹配全部請求(優先級最低,其他的location都匹配不到才匹配這一個)。
proxy_pass表示講這個請求轉發到tomcat_server,對應上面的upstream負載均衡列表。
這裏也可以寫proxy_pass http://locathost:18002;等等。
如果是http://localhost:18002/CardHolderWeb/;這裏最後要加/,nginx對/要求很嚴格。訪問網址就應該是localhost。
這裏如果location 後面是/efg/ ,這裏前後都加/,訪問網址應該是localhost/efg/CardHolderWeb。
意思是:訪問網址包括三部分,server_name/location/app,由localhost找到server_name對應的server,由第二項efg找到對應的location,由proxy_pass找到後臺服務器,最終得到實際的URL就是upstream下面的localhost:18002加上訪問地址去除第一項server_name、第二項location的值。
另外,upstream下面貌似只能寫地址+端口,否則nginx重啓報錯。
nginx在stop的時候檢查nginx.conf文件,錯誤的話stop執行失敗。
進入exe目錄,
nginx -s stop停止
nginx -s reload重啓
nginx啓動
proxy_next_upstream error timeout invalid_header http_404 http_502 http_503 http_504 http_500;
表示故障自動轉移。
一開始我後臺tomcat裏面兩個CardHolderWeb是不一樣的。跑出來每次都丟失了幾個css、圖片文件,原因是:加載jsp的順序是第一步拿到jsp文件,也就是一堆源代碼,然後再次多次訪問服務器去取其中引用的鏈接,如css js 圖片,在app1裏面取到jsp後,又隨機到另外一個app2去提取其中引用的css文件,而app2沒有這個文件。
或者app2根本沒有啓動。
加上這一句故障轉移就不用擔心了。
proxy_connect_timeout 1s;
表示連接超時時間。默認好像60秒。如果app1裏面沒有找到文件,就會在那裏轉60秒纔去app2找。#ip_hash;
這句註釋以後,登錄就一般會出現驗證碼錯誤。因爲初始頁面app1的session保存了驗證碼,登錄時到app2去找session。
所以ip_hash可以直截了當解決session問題。這個機制,就是根據訪問ip將其每次都分配到同一臺服務器。
如果nginx不能取得瀏覽器真實ip或者後端不是直接連接到tomcat,這個ip_hash就不一定能實現了。但是還有很多其他辦法。memcache session manage(msn)很常用。
-----------------------------------------------------------------------------------------------------------------------
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
upstream tomcat_server {
server localhost:18002;
server localhost:18001;
#ip_hash;
}
server {
listen 80;
server_name localhost;
index index.html index.htm index.php;
root d:/tools/nginx/html;
#location / {
# proxy_pass http://tomcat_server;
# proxy_connect_timeout 1s;
# proxy_next_upstream error timeout invalid_header http_404 http_502 http_503 http_504 http_500;
#}
location ^~/e/ {#沒有前綴會報500,請求/dd/a.jpg時
alias e:/;
index cc.html;
#root e:/;
}
location ~*\.jpg$ {
#請求的地址是不帶http和localhost這些前綴的。會是/dd/a.jpg。前面帶/
rewrite (((\w)*/)*)((\w)+(.jpg)) /e/$4 redirect;
}
}
}
index index.html index.htm index.php;
root d:/tools/nginx/html;
這裏是配置默認訪問地址,如請求地址localhost,會根據找到root目錄,依次找index羅列的文件。我在d:/tools/nginx/html下面有index.html,所以這個地址會打開index.html。如果不配置這兩句,訪問時就報404類似。如果root目錄下沒有index羅列的文件,會報出403 forbidden。
alias e:/;
index cc.html;
訪問localhost/e時會打開e:/cc.html。
alias和root不能同時使用。如果改成root e:/;打開的文件是e:/e/cc.html。
root與alias:alias的路徑就是值。root的路徑是值加上location後面的值。(後面要有/?)
這裏指的都是訪問地址去除第一項server_name、第二項location剩餘的部分。
nginx除了配置負載均衡,還可以保存靜態文件。比如取jsp引用的圖片,這個文件要從tomcat到nginx再到瀏覽器,所以現在可以把圖片複製到nginx主機,然後根據圖片的訪問地址加一個location,講訪問地址重定向到本地文件系統。這可不能叫做緩存。
如果要改這些圖片,就要到nginx主機去改。這時候改app裏面的圖片是沒有用的。
找不到文件重定向
location /testsession/img/ {
alias e:/hb/;
#if(!-e $request_filename) {
if (!-e $request_filename) {#上面的寫法報錯,另外這個if塊要加在location裏面
proxy_pass http://tomcat_server;
#return;#加return報錯
}
}
如果e:/hb/下面找不到文件,pass到後臺服務器去找。
假如訪問地址是localhost/testsession/img/b.jpg,進入location後只有/b.jpg這一部分,經過alias後得到e:/hb/b.jpg。如果是root e:/hb/;會把/testsession/img/加上。如果沒有/,得到值也不一樣。
if的語法要去很嚴格。if和 ( 之間要保留空格,而 ( 和 ! 之間不能有空格,可能跟版本也有關係。
if (!-e $request_filename)
表示文件或目錄找不到,$request_filename是全局變量,請求文件。
-f -d -e 分別表示文件、目錄、文件或目錄,!加在前面。
全局變量:
$args #這個變量等於請求行中的參數。
$content_length #請求頭中的Content-length字段。
$content_type #請求頭中的Content-Type字段。
$document_root #當前請求在root指令中指定的值。
$host #請求主機頭字段,否則爲服務器名稱。
$http_user_agent #客戶端agent信息
$http_cookie #客戶端cookie信息
$limit_rate #這個變量可以限制連接速率。
$request_body_file #客戶端請求主體信息的臨時文件名。
$request_method #客戶端請求的動作,通常爲GET或POST。
$remote_addr #客戶端的IP地址。
$remote_port #客戶端的端口。
$remote_user #已經經過Auth Basic Module驗證的用戶名。
$request_filename #當前請求的文件路徑,由root或alias指令與URI請求生成。
$query_string #與$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服務器地址,在完成一次系統調用後可以確定這個值。
$server_name #服務器名稱。
$server_port #請求到達服務器的端口號。
$request_uri #包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。
$uri #不帶請求參數的當前URI,$uri不包含主機名,如”/foo/bar.html”。
$document_uri #與$uri相同。
日誌格式
$remote_addr 與$http_x_forwarded_for 用以記錄客戶端的ip地址;
$remote_user :用來記錄客戶端用戶名稱;
$time_local : 用來記錄訪問時間與時區;
$request : 用來記錄請求的url與http協議;
$status : 用來記錄請求狀態;成功是200,
$body_bytes_s ent :記錄發送給客戶端文件主體內容大小;
$http_referer :用來記錄從那個頁面鏈接訪問過來的;
$http_user_agent :記錄客戶毒啊瀏覽器的相關信息;
nginx還有一個重要的功能,rewrite URL重寫。
location ~*\.jpg$ {
#請求的地址是不帶http和localhost這些前綴的。會是/dd/a.jpg。前面帶/
rewrite (((\w)*/)*)((\w)+(.jpg)) /e/$4 redirect;
}
會tomcat URL重寫的人看到這段代碼一眼就知道怎麼回事,而沒搞過的就不一定那麼容易能理解了。
location ~*\.jpg$ {
以.jpg結尾。十有八九的網頁資料都寫的是:location ~*\.(jpg|png)$,我這裏能啓動但是匹配不到。後來就改成這樣了。
rewrite (((\w)*/)*)((\w)+(.jpg)) /e/$4 redirect;
想達到的效果是,請求地址以.jpg結尾重定向到/e/這個location
比如地址localhost/a/b/c/b.jpg-》》》localhost/e/b.jpg-》》》e:/b.jpg
這裏分爲三部分,訪問地址、重定向地址,重定向類型,其中訪問地址要用正則表達式寫,而好像不能用{},不能啓動。
這裏的第一項正則表達式匹配到的地址就是/a/b/c/b.jpg
重定向地址的話,會重新加載這個地址,匹配location等等。這裏/e/$4得到的值就是/e/b.jpg,$4是從第一項正則表達式取到的,爲什麼是4呢。我是從一二三四五一個個試出來的。第三項如果用last,瀏覽器地址欄地址不會改變,而redirect就會顯示重定向後的地址,所以可以由此看到$1等等得到的值是多少。
開始一直以爲是$2的。
$1對應最外層第一個(),$2是$1裏面最外層第一個(),$3繼續,$4纔是最外層第二個(),也就是dd.jpg,$5是dd,$6是.jpg
nginx還有一個gzip模塊,意思是把文件打包發送到瀏覽器,然後瀏覽器將其解包,大多數瀏覽器都支持解包。
日誌:
http下面加一段:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'';
server下面加一句:
access_log logs/access.log main;
可以自定義日誌了。在logs文件夾下面有兩個日誌文件。但是好像不能記錄分發到哪一個後臺服務器。OK沒有了。