部署nginx反向代理及缓存
?
第一,???nginx?的介紹???????? 1 nginx?從0.7.48?版本后凱斯,支持烈士squid的緩存功能。該緩存是把URL及相關組合當作key,然后用md5編碼哈希后保存在硬盤上,因此nginx?支持任意的URl連接,同時也支持404/301/302?這樣非200?狀態碼。雖然目前官方nginx web?緩存服務器只能為指定的URL或者狀態碼設置過期時間,但是不支持類似squid的purge?指令,需要手動清除緩存頁面,但是,通過第三方的nginx模塊,可以清楚指定URL的緩存,當然nginx的web緩存服務主要是由proxy_cache相關指令集和fastcgi_cache相關指令集構成,而proxy_cache?主要是用于反向代理,又來緩存后端服務器的內容源而Fastcgi_cache?主要緩存的是動態程序
下載相關的軟件包
prce-8.00.tar.gz??? ngx_cache_purge-1.2.tar.gz?? nginx-0.8.53.tar.gz?
第三 安裝相關的軟件包?
#tar? xvf? prce-8.00.tar.gz
#cd? prce-8.00
#./configure
#make && make install?
#useradd -s /sbin/nologin ?www
#cd ../
#tar –xvf ngx_cache_purge-1.2.tar.gz
#tar? nginx-0.8.53.tar.gz
#cd nginx-0.8.53
#./configure? --user=www –group=www –add-module=../ngx_cache_purge-1.2 –prefix=/usr/local/nginx? --with-http_stub_status_module?? --with-http_ssl_module
#make && make install?
第四,修改并配置nginx??
#cd /usr/local/nginx/conf
?#vim nginx.conf?
? #nginx 運行的用戶?user? nobody;
#開啟的進程數
worker_processes? 1;
#定義錯誤日志的路徑及其日志級別
error_log /usr/local/nginx/logs/error.log crit;
#nginx?的進程
pid??????? logs/nginx.pid;?
#specifiles the value for maximum file descriptors that can be opened by this process
#文件句柄數,和系統單進程打開的文件數相同,不必理會進程個數
worker_rlimit_nofile? 65535;
events {
??? use epoll;
??? worker_connections? 1024; #定義的是單個進程的連接數,該值受系統進程打開文件數限制,需要修改打開的文件句柄數,但是max_client = worker_proxesses X work_connextions,
}
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" '
????????????????????? '"request_method $scheme://$host$request_uri $server_protocol" $status $body_bytes_sent'
????????????????????? '"$http_user_agent" "$http_x_forwarded_for"';
?? #?指定服務器名稱哈希的大小,hash bucket size?等于一路處理器緩存大小,與server_names_hash_max_size?共同控制保存服務器名的HASH表
?? server_names_hash_bucket_size 128;
? #?以下兩項是設定客戶端請求Header頭緩存去的大小,4?為個數。128k?為大小。申請4個128k。當http?的uri太長或者request header?過大時會報414? Request URI too large?或者400 bad request
?? client_header_buffer_size 32k;
?? large_client_header_buffers 4 128k;
?#HTTP請求的BODY?最大限制,若超出此值,報413 Request Entity Too Lager?
?? client_max_body_size 8m;??
?
#緩沖去代理用戶請求的最大字節數,可以理解為先保存本地,然后在傳給用戶
client_body_buffer_size 32k;
? ?#不允許客戶端主動關閉連接,如果該項為設置在nginx的日志中可能出現499 錯誤
?? proxy_ignore_client_abort on;
?? #nginx?和后端服務器連接超時時間 發起握手等候響應時間
?? proxy_connect_timeout 5;
? #連接成功后等候后端服務器響應時間,其實已經進入后端的排隊等候處理
?? proxy_read_timeout 60;
?? #后端服務器數據回傳時間,就是在規定的時間內后端服務器必須傳完所有的數據
??proxy_send_timeout 5; ?
#代理請求緩存去,該緩存去間保存用戶的頭信息,以供nginx進行規則處理一般只要保能保存下頭信息即可?
?proxy_buffer_size 32k;?
#告訴nginx保存單個用的幾個buffer?最大用多少空間
proxy_buffers? 4 64k;
#高負載下緩沖大小(proxy_buffers*2)
?? ?proxy_busy_buffers_size 128k;,
? ?#設置緩存文件夾大小,如果大于該值,將從upstream?服務器傳遞請求,而不緩沖到磁盤上
? ??proxy_temp_file_write_size 1024m;
? ?#這個將為打開文件指定緩存,默認是沒有啟用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求后刪除緩存。
? ? open_file_cache max=102400 inactive=20s;
? ? #這個是指多長時間檢查一次緩存的有效信息。
? ? open_file_cache_valid 30s;
? ? #open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,它將被移除。
open_file_cache_min_uses 1;??? ?
??#shutdown error display nginx version
??? ?#?關閉錯誤時的nginx?的版本顯示
??? server_tokens off;?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
?? #open os function sendfile
??? #?打開高效的文件傳輸模式
sendfile??????? on;
?#tcp_nopush???? on;
??? tcp_nopush???? on; #?打開linux TCP_CORK,只有sendfile?打開時,該項才有效,用來發送系統HTTP response headers?設置選項的目的是告訴TCP協議不要僅僅為清空發送的緩存而發送報文段。通常三個設置TCPNOPUSH?插口選項。當請求長度超過報文段最大長度時,協議就好可能發出滿長度的報文段,這樣可以減少報文段的數量,減少的程度取決于每次發送的數量
??? keepalive_timeout? 60;
??? tcp_nodelay on; #打開TCP_NODELAY?在包含了keepalived?才有效,上面的四項有效的提高了文件傳輸性能,用sendfile() 函數來轉移大量的數據,協議會需要預先解決數據包包頭部分,正常情況下包頭很小,而且套接字上設置了TCP_NODELAY?。有包頭的包將被立即傳輸,在一些情況下,因為包成功的被對方收到后需要請求對方確認,這樣,大量的數據傳輸就會被延遲而且產生大量不必要的網絡流量交換,但是在socket上是指了TCP_CORK?,就像個管道塞住塞子把帶有包頭的包填滿數據,所有的數據根據大小進行填充,自動通過數據包發送出去,但是在數據傳送完成是,需要把塞子打開????
?? #開啟gzip?的設置
#gzip? on;
gzip? on;
#設置允許壓縮的頁面的最小字節數,頁面字節數從Header?頭中的Content-Length中獲取建議設置成大于1k的字節數,小于1k可能越壓越大
??? gzip_min_length 1k;
??? #設置以16k為單位4倍申請內存做壓縮結果緩存,默認值是申請跟原始數據相同大小的內存空間存儲gzip壓縮結果
gzip_buffers 4 16k;
#默認1.1?,大部分瀏覽器支持gzip?壓縮
gzip_http_version 1.1;
#設置壓縮級別 壓縮比率1-9,壓縮比率越大,越消耗系統資源
?gzip_comp_level 2;
#設置壓縮列席
gzip_types?? text/plain application/x-javascript text/css application/xml;
#設置前端的緩存服務,如squid緩存經過nginx壓縮的數據,該選項在做反向代理是設定壓縮,后面參數為驗證的header頭信息,在做相應的壓縮處理,
??? gzip_vary on;???
?? #proxy_cache???
?
? #?該處設置的是緩存的目錄及其設置的大小
??? proxy_cache_path? /usr/local/nginx/proxy_temp levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
?? #設置負載池
?? upstream backend_server {
server 192.168.2.194:80 ;
?#?注weight設置的權重? max_fails?設置的是健康監測失敗次數,timeout?設置超時時間 當然此處主要是設置nginx的反向代理及其緩存,對于nginx?的負載均衡,在以后的文章中再詳細介紹
# server 192.168.2.107:80 weight=1 max_fails=2 fail_timeout=30s;
? } ???
server {
??? #注:監聽的端口號
??????? listen?????? 80;
?? ? ? ?#server_name? localhost;
?? ? ? ? #設置監聽的主機名
?? ? ? ? ?server_name?freehat.blog.51cto.com;
?? ? ? ? ? if ($host !~ 'freehat.blog.51cto.com') {
?? ? ? ? ? ? return 403;
?? ? ? ? ?}
??????? #charset koi8-r;
??? ? ??#access_log? logs/host.access.log? main;
? ? ? ? ?#location / {
? ? ? ? ?# ? root?? html;
? ? ? ? ?# ? index? index.html index.htm;
? ? ? ? #}???
??????? #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;
??????? }?? ? ?
? ? ? ? #設置擴展名以gif? .jpg .css?等結尾的靜態文件緩存
?????? location ~.*\.(gif|jpg|jpeg|png|bmp|sqf|js|css)$
???????? {???
?? ? ? ? ? ??#設置防盜鏈
?? ? ? ? ? valid_referers none blocked freehat.blog.51cto.com;
?? ? ? ? ? if ($invalid_referer) {
?? ? ? ? ? ?return 404?
???????????? #如果后端的服務器返回502 504?執行超時等錯誤,自動將請求轉發到upstream?負責均衡池中的另外一臺服務器,實現故障轉移
???????????? proxy_next_upstream http_502 http_504 error timeout invalid_header;
???????????? #進行緩存,使用web緩存去cache_one
???????????? proxy_cache cache_one;
???? ???????#以域名,URI,參數組合成web緩存的Key值,Nginx根據Key值哈希,儲存緩存內容到二級緩存目錄內
??????????? #對不同的HTTP?狀態碼設置不同的緩存時間
???????????? proxy_cache_valid 200 304 12h;
???????????? proxy_cache_valid any 1m;
???????????? proxy_set_header Host $host;
???????????? proxy_set_header X-Real-IP $remote_addr;
???????????? #設定proxy_set_header? Accept-Encoding?或者是后臺服務器關閉gzip,該臺機器才不會緩存被壓縮的文件,造成亂碼
???????????? proxy_set_header Accept-Encoding "none";
??????????? # proxy_set_header Accept-Encoding "";?同上面一項相同
???????????? #設置proxy_cache?支持后臺設定的expires?, 即使支持HTTP頭信息定義的緩存規則
???????????? proxy_ignore_headers "Cache-Control" "Expires";
???????????? if ( !-e? $request_filename )
??????????????? {
??????????????? proxy_pass??http://backend_server;
???????????????? }注: 該項是如果client?請求的文件在cache?中保存,nginx?直接從cache中把對應的文件返還給client?,不會在去后端的Server?去取對應的文件
???????????? expires 1h;??設置過去的時間
}#set don't? php jsp cgi in cache??設置php jsp cgi?不保存在cache中
? location ~.*\.(php|jsp|cgi)?$
?? {
???? proxy_set_header Host $host;
???? proxy_set_header X-Forwarded-For $remote_addr;
???? proxy_pass http://backend_server;
??? }
#set js and css cache? expire time?設置js|css?在瀏覽器中過期的時間
?????? location ~ .*\.(js|css)
??????????? {
??????????????? expires? 1h;
???????????? }
#clean all cache??設置清除所有的cache
?location ~/purge(/.*)
?????? {
?????? allow?? 127.0.0.1;
?????? allow? 192.168.2.0/24;
?????? deny??? all;
?????? proxy_cache_purge cache_one $host$1$is_args$args;
????? }
??? }
}
?第五,啟動機及其關閉nginx的命令
??1 啟動之前檢查nginx的主配置文件是否有錯誤
?? ? #?/usr/local/nginx/sbin/nginx ?-t
??2 ?啟動nginx的方式
?? ? ?#?/usr/local/nginx/sbin/nginx ?-c ?/usr/local/nginx/conf/nginx.conf?
??3 關閉nginx 的方式
?? ? ?#?/usr/local/nginx/sbin/nginx ?-s ?stop
??4 平滑啟動nginx?
?? ? ?#kill ?-HUP ?`cat /usr/local/nginx/logs/nginx.pid`
?
轉載于:https://blog.51cto.com/freehat/511002
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的部署nginx反向代理及缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何知道自己的脸型(怎么知道自己是什么脸
- 下一篇: 化油器接头漏气高速熄火怎么回事