nginx配置文件讲解(二)
?原文:http://www.blogjava.net/xiaomage234/archive/2011/09/08/358247.html
配置環境:
三臺CentOS5.3,一臺做nginx代理,2臺apache做頁面測試。apache端口改為:8080,nginx使用80口接收客戶請求
yum -y install pcre-devel openssl openssl-devel ? ? ? ? ? ? ? ? ? //安裝包,否則編譯時候出錯
#useradd ?www
#groupadd ?www
#usermod -g www www ? ? ? ? //設置nginx的用戶和組
#tar ?xzvf ?pcre-7.8.tar.gz
#./configure
#make ; make install ? ? ? ? ? ? ? ?//安裝pcre讓nginx支持rewrite重寫方便以后所需
[root@localhost tar]# cd nginx-0.7.16/
[root@localhost nginx-0.7.16]# ./configure ?--user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
?--with-http_stub_status_module:這個模塊用于獲取nginx自上次啟動以來的工作狀態,非核心模塊
--with-http_ssl_module ? ? ? ? ? ? ? : 把ssl編譯進去, 僅僅指定openssl庫的源代碼路徑還是不夠的
[root@localhost nginx-0.7.16]#make ?; meke install
#cd ? /usr/local/nginx/conf/nginx.conf
#vi ?nginx.conf
user ?www www; ? ? ? ? ? ? ? ? ? ? ? //設置用戶和組
worker_processes ?4; ? ? ? ? ? ? //生成進程數,等于CPU總核數兩倍
?
error_log ?/data1/logs/nginx_error.log crit; ? ? ?//錯誤日志路徑,錯誤日志可選項為:【debug ?info ?notice ?warn ?error ? crit】
?
pid ? ? ? ?/usr/local/nginx/logs/nginx.pid; ? ? ? ? ? ? ?//PID路徑
worker_rlimit_nofile 51200; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //指定文件描述符數量
?
events {
? ? use epoll; ? ? ? ? ? ? ? //使用網絡I/O模型
? ? worker_connections ?51200; ? ? ? ? ? ?//允許連接數,文件描述符
}
?
?
http
?{
? ? include ? ? ? mime.types; ? ? ? ? ? //文件類型
? ? default_type ?application/octet-stream; ? ? ? ? //默認文件類型
? ? charset ?UTF-8 ? ? ? ? ? ? ? ? ? ? ? //語言類型
? ? server_names_hash_bucket_size 128; ? ? ? ? ? ? ? //根據CPU的cache來設定
? ? client_header_buffer_size 4; ? ? ? ? ?//記錄緩存4k
? ? large_client_header_buffers 4 8k; ? ? ?//如果4k不夠,用8k
?
? ? sendfile ? ? ? ?on; ? ? ? ? //指定nginx是否調用sendfile函數(zero copy方式)來輸出文件,普通應用必須設為on,對于普通文件用on。如果進行下載I/O負載應用,設置為off,以平衡磁盤磁盤和網絡I/O處理速度。
? ? #tcp_nopush ? ? on; ? ? ?//允許或禁止使用socket的TCP_NOPUSH(on freebsd或TCP_COR(on ?linux),此選擇僅僅在使用sendfile時候可用,
?
? ? keepalive_timeout ?65; ? ? ? ? ? ?//長連接超時時間
? ? tcp_nodelay on;
? ? fastcgi_connect_timeout 300;
? ? fastcgi_send_timeout 300;
? ? fastcgi_read_timeout 300;
? ? fastcgi_buffer_size 64k;
? ? fastcgi_buffers 4 64k;
? ? fastcgi_busy_buffers_size 128k;
? ? fastcgi_temp_file_write_size 128k;
?
? ?#開啟gzip壓縮,用于支持在線實時壓縮輸出數據流
? ? gzip on; ? ? ? ? ? ? ? ? ? ? ? ? ?//off關閉或者on開啟gzip功能
? ? gzip_min_length 1k; ?//設置允許壓縮最小字節數,0表示多大都壓,最好設置大于1k,小于1k越壓越大
? ? gzip_buffers 4 16k; ? ? ? ?//系統獲取幾個單位的緩存,用于存儲gzip壓縮結果數據流。4 4k 代表以4k為單位,按照原始數據大小以4k為單位的4倍申請內存。 4 8k 代表以8k為單位,按照原始數據大小以8k為單位的4倍申請內存,如果沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。
? ? gzip_http_version 1.1; ? ?//判斷http協議版本,是否支持壓縮,否則用戶看到亂碼。默認即可,大部分都得支持
? ? gzip_comp_level 2; ? ? //gzip壓縮比,1 壓縮比最小處理速度最快,9 壓縮比最大但處理最慢
? ? gzip_types text/plain application/x-javascript text/css application/xml; ? ? //默認nginx是開啟gzip壓縮,但是只針對html文件押送 ?gzip_types ? ? ? text/plain application/x-javascript text/css text/html application/xml text/javascript; ?在nginx的gzip的gzip_types加上
? ? gzip_vary on; ? //和http頭有關系,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮。
?
? ? client_max_body_size 50m; ? ? ? ? ? ? //允許客戶端請求的最大單個文件字節數
? ? client_body_buffer_size 128k; ? ? ? ?//緩沖區代理用戶端請求的最大字節數,可以理解先保存到本地在穿給用戶
? ? proxy_connect_timeout 600; ? ? ? ?//和后端服務器連接的超時時間,發起握手等候相應超時時間
? ? proxy_read_timeout 600; ? ? ? ? //連接成功后,等待后端服務器相應時間,已經進入后端的排隊之中等候處理
? ? proxy_send_timeout 600; ? ? ? ?//后端服務器數據回傳時間,在規定時間內服務器必須傳完所有數據
? ? proxy_buffer_size 16k; ? ? ? ?//只保存用戶頭信息一共nginx進行規則處理,用于緩存代理請求
? ? proxy_buffers ? ?4 32k; ? ? //告訴nginx保存單個用的幾個Buffer最大用多大空間
? ? proxy_busy_buffers_size 64k; ? //如果系統很忙可以申請更大的proxy_buffers,官方推薦 *2
? ? proxy_temp_file_write_size 64k; ? ?//proxy緩存臨時文件大小
?
? ? upstream http_server_pool {
? ? ? ? server 192.168.1.2:8080 weight=4 max_fails=2 fail_timeout=30s;
? ? ? ? server 192.168.1.3:8080 weight=2 max_fails=2 fail_timeout=30s;
? ? ?} ? ? ? ? ?//設置地址池,后端2臺服務器
?
? ? server ? ? ? ? ?//第一個虛擬主機,反向代理http_server_pool這組服務器
? ? ? {
? ? ? ? listen ? ? ? 80; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//監聽端口
? ? ? ? server_name ?www.xiao.com; ? ? ? ? ? //主機名稱
?
? ? ? ? location /
? ? ? ? {
? ? ? ? ? ? ? ? proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; //http://www.2tutu.com/post/2008/631.html ? ? ? ? //后端服務器返回500 503 404錯誤,自動請求轉發到upstream池中另一臺服務器
? ? ? ? ? ? ? ? proxy_pass http://http_server_pool;
? ? ? ? ? ? ? ? proxy_set_header Host www.xiao.com;
? ? ? ? ? ? ? ? proxy_set_header X-Forwarded-For ?$remote_addr;
? ? ? ? }
? ? ? ? access_log ?logs/www.xiao.com.access.log ?combined;
? ? ? ?}
? ? ? ?}
proxy_set_header Host www.xiao.com:
proxy_set_header ?Host ?$host :首先說明 proxy_set_header 指令在向反向代理的后端Web服務器發起請求時添加指定的 Header頭信息,后端web服務器有多個基于域名的虛擬主機時,通過頭信息Host,用于指定請求的域名,這樣后端web才能識別反向代理請求哪個虛擬主機處理。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for :聯系下面PS中所寫,在后端web中就算加上$http_x_Forwarded_for這條,也得不到用戶的IP,所以在nginx反向代理添加Header頭信息 X-Forwarded-For在配合后端服務器日志文件的$http_x_Forwarded_for這條就可以獲得用戶的IP地址了。
?PS:假設Nginx作為Web服務器,nginx或Squid作為反向代理后,就不能獲取客戶端的真實IP地址了,由于在客戶端和Web增加了中間層,web沒有真實的IP,通過$remote_addr變量拿到是反向代理的IP,Web代理可以增加$http_x_Forwarded_for信息,用于記錄客戶端IP和原來客戶請求的服務器地址,在日志格式中加上即可。
? log_format ?main ? '$http_x_Forwarded_for '
? ? ? ? ? ? ? ? ? ? ? ?'$remote_addr - $remote_user [$time_local] "$request" '
? ? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent "$http_referer" '
? ? ? ? ? ? ? ? ? ? ? '"$http_user_agent" "$http_x_forwarded_for"';
? ? access_log ?/tmp/Nginx.access.log ?main; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //在后端Web里面加上這樣就可以了
upstream : nginx支持4種算法,下面一一介紹
1、 輪詢
每個請求按時間順序分配到不同的后端服務器了,后端服務器down掉,自動切除。
2、weight
設定服務器權值: weight=2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? weight=4 ? ? ? ? ?服務器性能不均時候使用
3、 ip_hash
每個請求按訪問ip的hash結果分配,每個訪客有固定的后端服務器,可以解決session問題
4、 fair(第三方)
按后端服務器的響應時間來分配,響應時間短的優先分配
5、url_hash (第三方)
按訪問的url的hash結果分配,使每個url定向到同一個后端服務器,后端為緩存服務器比較有效。
以往的架構lvs或者dns輪詢,這樣雖然squid里面的均衡的,但是忽略了一點就是數據量,雖然每臺squid是均勻但是都是滿載的,重復的請求,會占用很多空間,在前面換上nginx在配上 url_hash,根據url分流后,每一個url會只存在一個squid上,每臺squid數據完全不同。http://edu.codepub.com/2010/0202/20282.php
upstream http_server { ? ? ? ? ? ? //定義負載均衡設備的Ip及設備狀態
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
down : 當前的IP server暫時不參與負載,不進行反向代理
weight: 默認為1,weight越大,負載的權重越大
max_fails: 允許請求失敗的次數默認為1,當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤。
fail_timeout : max_fails次失敗后,暫停的時間
backup: ?其它所有非backup機器down或者忙時候,請求backup機器,這臺機器壓力最輕
PS: nginx支持同時設置多組負載均衡,給不同的server使用
location:設置對URL進行匹配,比如 location ?/ ?, ?location ?/data 這兩個設置優先級,/ 下也可以,但是不如 /data下搜索更快,定位更準。
轉載于:https://blog.51cto.com/sndapk/990506
總結
以上是生活随笔為你收集整理的nginx配置文件讲解(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LLVM 与 Clang 介绍 — Li
- 下一篇: 问题Re-installation fa