Nginx?+Tomcat?實現動靜態分離
?
???動靜態分離就是Nginx處理客戶端的請求的靜態頁面(html頁面)或者圖片,Tomcat處理客戶端請求的動態頁面(jsp頁面),因為Nginx處理的靜態頁面的效率高于Tomcat。
一.Nginx簡介:
???Nginx一個高性能的HTTP和反向代理服務器,?具有很高的穩定性和支持熱部署、模塊擴展也很容易。當遇到訪問的峰值,或者有人惡意發起慢速連接時,也很可能會導致服務器物理內存耗盡頻繁交換,失去響應,只能重啟服務器,Nginx采取了分階段資源分配技術,處理靜態文件和無緩存的反向代理加速,實現了負載均衡和容錯,在這樣高并發的訪問情況下,能經受起高并發的處理。
?
二.Nginx安裝與配置
? 第一步:下載Nginx?安裝包?
?????http://nginx.org/en/download.html
??第二步:在Linux上安裝Nginx?
? ? 1.#tar?zxvf?nginx-1.7.8.tar.gz??//解壓
? ? 2.#cd?nginx-1.7.8
? ? 3.#./configure?--with-http_stub_status_module?--with-http_ssl_module//啟動server狀態頁和https模塊
會報缺少PCRE?library錯誤,如圖所示:
?
這時先執行第三步安裝PCRE?,然后在3執行一下,這就可以了
???4.make?&&?make?install?//編譯并安裝
???5.測試一下安裝配置是否正確,Nginx安裝在/usr/local/nginx
? ? #/usr/local/nginx/sbin/nginx?-t,如圖所示:
? ??
?
??第三步:在linux上安裝PCRE?
? ? 1.#tar?zxvf?pcre-8.10.tar.gz??//解壓
? ? 2.cd?pcre-8.10
? ? 3../configure
? ? 4.make?&&?make?install//編譯并安裝
?
三.Nginx?+Tomcat?實現動靜態分離
?
???動靜態分離就是Nginx處理客戶端的請求的靜態頁面(html頁面)或者圖片,Tomcat處理客戶端請求的動態頁面(jsp頁面),因為Nginx處理的靜態頁面的效率高于Tomcat。
??第一步:我們要配置Nginx文件
?#vi?/usr/local/nginx/conf/nginx.conf
- #user??nobody;??
- worker_processes??1;??
- error_log??logs/error.log;??
- pid???????logs/nginx.pid;??
- ??
- events?{??
- ????use?epoll;??
- ????worker_connections??1024;??
- }??
- ??
- ??
- http?{??
- ????include???????mime.types;??
- ????default_type??application/octet-stream;??
- ????log_format??main??'$remote_addr?-?$remote_user?[$time_local]?"$request"?'??
- ?????????????????????'$status?$body_bytes_sent?"$http_referer"?'??
- ?????????????????????'"$http_user_agent"?"$http_x_forwarded_for"';??
- ??
- ????access_log??logs/access.log??main;??
- ????sendfile????????on;??
- keepalive_timeout??65;??
- gzip?on;????
- gzip_min_length??1k;????
- gzip_buffers?????4??16k;????
- gzip_http_version?1.0;????
- gzip_comp_level?2;????
- gzip_types??text/plain?application/x-javascript?text/css?application/xml;????
- gzip_vary?on;????
- ????server?{??
- ????????listen???????80?default;??
- ????????server_name??localhost;??
- ????????<span?style="color:#ff0000;">?location?~?.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$?//由nginx處理靜態頁面</span>??
- ?????????????{???
- ??????????????????root???/usr/tomcat/apache-tomcat-8081/webapps/ROOT;???
- ???????????????????expires??????30d;?//緩存到客戶端30天??
- ???????????????}???
- ????????error_page??404??????????????/404.html;??
- ??
- ????????#redirect?server?error?pages?to?the?static?page?/50x.html??
- ??????????
- ????????error_page???500?502?503?504??/50x.html;??
- ????????location?=?/50x.html?{??
- ????????????root???html;??
- ????????}??
- ?????????<span?style="color:#ff0000;">?location?~??\.(jsp|do)$??{//所有jsp的動態請求都交給Tomcat處理?</span>??
- ???????????<span?style="color:#ff0000;">?proxy_pass?http://192.168.74.129:8081;??//來自jsp或者do的后綴的請求交給tomcat處理</span>??
- ????????????proxy_redirect?off;??
- ????????????proxy_set_header?Host?$host;????//后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP??
- ????????????proxy_set_header?X-Real-IP?$remote_addr;??
- ????????????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;???//nginx跟后端服務器連接超時時間??
- ?????????????proxy_read_timeout?90;?????//連接成功后,后端服務器響應時間??
- ?????????????proxy_buffer_size?4k;??????//設置代理服務器(nginx)保存用戶頭信息的緩沖區大小??
- ?????????????proxy_buffers??6??32k;???????//proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置??
- ????????????proxy_busy_buffers_size?64k;//高負荷下緩沖大小(proxy_buffers*2)??
- ???????????proxy_temp_file_write_size?64k;?//設定緩存文件夾大小,大于這個值,將從upstream服務器傳??
- ????????}??
- ????????
- ????}????
- ??
- }??
?第二步:在tomcat?下的webapps/ROOT下新建index.html靜態頁面,如圖所示:
?
? 第三步:啟動Nginx服務
??#sbin/nginx ? 如圖所示:
? ?
?
?第四步:我們頁面訪問http://192.168.74.129/index.html?能正常顯示正常的內容,如圖所示:
???
??
?第五步:測試Nginx?和Tomcat高并發的情況下處理靜態頁面性能如何?
? ? 采用了?Linux??ab網站壓力測試命令來測試一下性能
???1.測試一下Nginx?處理靜態頁面的性能
?????ab?-c?100?-n?1000?http://192.168.74.129/index.html
?????這個表示同時處理100個請求并運行1000次index.html文件,如圖所示:
? ? ?
? ?2.測試一下Tomcat處理靜態頁面的性能
?????ab?-c?100?-n?1000?http://192.168.74.129:8081/index.html
?????這個表示同時處理100個請求并運行1000次index.html文件,如圖所示:
? ? ?
? ?相同的處理靜態文件,Nginx處理的靜態性能比Tomcat?好。Nginx每秒能請求5388次,而tomcat只請求2609次。
?
總結:我們在Nginx配置文件中,配置靜態交給Nginx處理,動態請求交給Tomcat,提供了性能。
?
四.Nginx?+Tomcat?負載均衡與容錯
? 我們在高并發的情況下,為了提高服務器的性能,減少了單臺服務器的并發壓力,我們采用了集群部署,還能解決為了避免單臺服務器掛掉,服務不能訪問這種情況下,處理容錯問題。
?
?第一步:我們這邊部署了兩天tomcat服務器,192.168.74.129:8081和192.168.74.129:8082
?
?第二步:Nginx作為了代理服務器,客服端請求服務器端時,采用了負載均衡來處理,這樣就能平均的把客服端請求分發到每一天服務器,這樣減少服務器端的壓力。配置Nginx下的nginx.conf文件。
? ?
??#vi?/usr/local/nginx/conf/nginx.conf
? ??
- #user??nobody;??
- worker_processes??1;??
- error_log??logs/error.log;??
- pid???????logs/nginx.pid;??
- ??
- events?{??
- ????use?epoll;??
- ????worker_connections??1024;??
- }??
- ??
- ??
- http?{??
- ????include???????mime.types;??
- ????default_type??application/octet-stream;??
- ????log_format??main??'$remote_addr?-?$remote_user?[$time_local]?"$request"?'??
- ?????????????????????'$status?$body_bytes_sent?"$http_referer"?'??
- ?????????????????????'"$http_user_agent"?"$http_x_forwarded_for"';??
- ??
- ????access_log??logs/access.log??main;??
- ????sendfile????????on;??
- keepalive_timeout??65;??
- gzip?on;????
- gzip_min_length??1k;????
- gzip_buffers?????4??16k;????
- gzip_http_version?1.0;????
- gzip_comp_level?2;????
- gzip_types??text/plain?application/x-javascript?text/css?application/xml;????
- gzip_vary?on;????
- <span?style="color:#ff0000;">upstream?localhost_server?{??
- ????????ip_hash;??
- ????????server?192.168.74.129:8081;??
- ????????server?192.168.74.129:8082;??
- ????}</span>??
- ??
- ????server?{??
- ????????listen???????80?default;??
- ????????server_name??localhost;??
- ???????<span?style="color:#ff0000;">??location?~?.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$?//由nginx處理靜態頁面</span>??
- ?????????????{???
- ??????????????????root???/usr/tomcat/apache-tomcat-8081/webapps/ROOT;???
- ???????????????????expires??????30d;?//緩存到客戶端30天??
- ???????????????}???
- ????????error_page??404??????????????/404.html;??
- ??
- ????????#redirect?server?error?pages?to?the?static?page?/50x.html??
- ??????????
- ????????error_page???500?502?503?504??/50x.html;??
- ????????location?=?/50x.html?{??
- ????????????root???html;??
- ????????}??
- ??????????<span?style="color:#ff0000;">location?~??\.(jsp|do)$??{//所有jsp的動態請求都交給Tomcat處理?</span>??
- ???????????<span?style="color:#ff0000;">proxy_pass?http://localhost_server;??//來自jsp或者do的后綴的請求交給tomcat處理</span>??
- ????????????proxy_redirect?off;??
- ????????????proxy_set_header?Host?$host;????//后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP??
- ????????????proxy_set_header?X-Real-IP?$remote_addr;??
- ????????????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;???//nginx跟后端服務器連接超時時間??
- ?????????????proxy_read_timeout?90;?????//連接成功后,后端服務器響應時間??
- ?????????????proxy_buffer_size?4k;??????//設置代理服務器(nginx)保存用戶頭信息的緩沖區大小??
- ?????????????proxy_buffers??6??32k;???????//proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置??
- ????????????proxy_busy_buffers_size?64k;//高負荷下緩沖大小(proxy_buffers*2)??
- ???????????proxy_temp_file_write_size?64k;?//設定緩存文件夾大小,大于這個值,將從upstream服務器傳??
- ????????}??
- ????????
- ????}????
- ??
- }??
?
?
說明:
???1.upstream?中的server是指向服務器的IP(域名)和端口,后面還可以帶參數
? ? ?1)weight?:設置服務器的轉發權重?默認值是1。
? ? ?2)max_fails?:?是與fail_timeout配合使用,是指在fail_timeout時間段內,如果服務器轉發失敗次數超過max_fails設置的值,這臺服務器就不 ? ? ? ? ? ? ? ? ? ? 可用,max_fails默認值是1
? ? 3)fail_timeout?:表示在該時間段內轉發失敗多少次就認為這臺服務器不能用。
? ? 4)down:表示這臺服務器不能用。
? ? ?5)backup:表示使ip_hash設置的針對這臺服務器無效,只有在所有非備份的服務器都失效后,才會向服務器轉發請求。
?
? 2.ip_hash?設置是在集群的服務器中,如果同一個客戶端請求轉發到多個服務器上,每臺服務器可能緩存同一份信息,這會造成資源的浪費,采用的ip_hash設置會把同一個客戶端第二次請求相同的信息時,會轉發到第一次請求的服務器端。但ip_hash不能和weight?同時使用。