Nginx
Nginx常用功能
- Http代理,反向代理:作為web服務器最常用的功能之一搪缨,尤其是反向代理次氨。
Nginx在做反向代理時,提供性能穩(wěn)定艾凯,并且能夠提供配置靈活的轉(zhuǎn)發(fā)功能献幔。Nginx可以根據(jù)不同的正則匹配,采取不同的轉(zhuǎn)發(fā)策略趾诗,比如圖片文件結(jié)尾的走文件服務器蜡感,動態(tài)頁面走web服務器蹬蚁,只要你正則寫的沒問題,又有相對應的服務器解決方案郑兴,你就可以隨心所欲的玩犀斋。并且Nginx對返回結(jié)果進行錯誤頁跳轉(zhuǎn),異常判斷等情连。如果被分發(fā)的服務器存在異常叽粹,他可以將請求重新轉(zhuǎn)發(fā)給另外一臺服務器,然后自動去除異常服務器却舀。
- 負載均衡
Nginx提供的負載均衡策略有2種:內(nèi)置策略和擴展策略虫几。內(nèi)置策略為輪詢,加權輪詢挽拔,Ip hash辆脸。擴展策略,就天馬行空螃诅,只有你想不到的沒有他做不到的啦啡氢,你可以參照所有的負載均衡算法,給他一一找出來做下實現(xiàn)术裸。
Nginx配置文件結(jié)構(gòu)
看一下nginx的默認配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
嵌入其他配置文件
這個點是我一開始掉坑的地方倘是,因為需求來了直接上手看的nginx,但是一直在默認配置中找不到已經(jīng)上線的應用配置袭艺,最后才了解到include嵌入其他的配置文件了辨绊,最后根據(jù)嵌入文件的路徑成功地找到了引入的配置文件,正是我想要的
Nginx worker進程運行的用戶及用戶組
默認 user nobody nobody;
user用于設置master進程啟動之后匹表,fork出的worker進程運行在哪個用戶和用戶組下
Nginx worker進程個數(shù)
在master/worker運行方式下指定worker進程的個數(shù)
worker進程的數(shù)量會直接影響性能门坷,每個worker進程都是單線程的進程,它們會調(diào)用各模塊以實現(xiàn)多種多樣的功能袍镀,如果這些模塊確定不會出現(xiàn)阻塞時的調(diào)用默蚌,那么有多少CPU內(nèi)核就應該配置多少個進程;反之苇羡,如果可能存在多個可能阻塞的調(diào)用绸吸,則需要多為worker分配一些進程
- 例如磁盤IO一直是后端服務的一個瓶頸,如果分配的worker進程都是在執(zhí)行阻塞式的IO服務设江,那么這個時候Nginx的效率可能會大大降低锦茁,這個時候就需要為Nginx多分配一點工作進程
- 多worker進程可以充分利用多核的系統(tǒng)架構(gòu),但若worker進程的數(shù)量多于CPU內(nèi)核數(shù)的話叉存,這樣同樣會增大進程之間來回切換造成的消耗(Linux是搶占式內(nèi)核)码俩,一般情況下與內(nèi)核相等的worker進程,就可以綁定到CPU內(nèi)核上
虛擬主機與請求分發(fā)
由于IP地址數(shù)量有限歼捏,一次你經(jīng)常存在多個諸暨域名對應同一個IP地址情況稿存,這時在nginx.conf中就可以按照server_name(對應用戶請求中的主機域名)并通過server塊來定義虛擬主機笨篷,每個server塊就是個虛擬主機,他只處理與之相對應的主機域名請求
主機名稱
server_name后可以跟多個主機名稱瓣履,在開始處理一個HTTP請求時率翅,Nginx會取出header中的Host,與每個server中的server_name進行匹配袖迎,決定到哪個server塊來處理這個請求冕臭,匹配規(guī)則也是有優(yōu)先級的①首先選擇所有字符串都完全匹配的server_name②其次選擇通配符在前的③選擇通配符在后的④最后選擇正則表達式匹配的
location
location會嘗試根據(jù)用戶請求中的URI來匹配/uri表達式,如果可以匹配,就會選擇這個location塊中的配置來處理用戶請求
文件路徑的定義
以root方式設置資源路徑比如說一條HTPP請求是一條請求資源的請求燕锥,這個時候就可以使用server和location匹配到這一條資源請求辜贵,并且使用root指定這條資源請求的目錄,實現(xiàn)資源訪問脯宿,同樣實現(xiàn)資源文件的訪問還可以在location匹配到url請求之后使用alias,這兩者間的配置有一些小的差別
一個用戶如果通過一條HTTP請求需要訪問到/user/local/nginx/conf/nginx.conf文件可使用如下兩種配置
location /conf {
alias /usr/local/nginx/conf/;
}
location /conf {
root /usr/local/nginx/;
}
使用alias時泉粉,在URI向?qū)嶋H文件路徑的映射過程中连霉,已經(jīng)把location后的部分字符串丟棄掉了,因此嗡靡,/conf/nginx.conf請求將根據(jù)alias path映射為path/nginx.conf
root則不一樣跺撼,他會根據(jù)完整的URI請求進行映射,因此/conf/nginx.conf將會被映射未root path/conf/nginx.conf讨彼,這也是為什么root可以放置到http歉井、server、location中而alias只能存在于location中的原因
使用HTTP proxy module配置一個反向代理服務器
反向代理(reverse proxy)方式是指用代理服務器來接受Internet上的連接請求哈误,然后根據(jù)請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)中的上游服務器哩至,并將從上有服務器上得到的結(jié)果返回Internet上請求連接的客戶端,此時代理服務器對外的表現(xiàn)就是一個web服務器蜜自,充當反向代理服務器也是nginx的通常用法
一般來說如果nginx作為反向代理服務器菩貌,接收到的請求若是針對靜態(tài)文件,則直接通過nginx將請求映射到本地的靜態(tài)資源上重荠,如果需要動態(tài)的結(jié)果箭阶,即發(fā)出的是一條動態(tài)的請求,則需要繼續(xù)反向代理到真正的web服務器
當客戶端發(fā)來HTTP請求的時候戈鲁,Nginx并不會立刻轉(zhuǎn)發(fā)到上游服務器仇参,而是先把用戶的請求(包括HTTP包體)完整地接收到Nginx所在服務器的硬盤或者內(nèi)存中,然后再向上游服務器發(fā)起連接婆殿,把緩存的客戶端請求轉(zhuǎn)發(fā)到上游服務器诈乒,而其余的一些反向代理服務器采用的策略是邊接收客戶端的請求,邊進行轉(zhuǎn)發(fā)到上游服務器
Nginx這中工作方式存在一個明顯的缺點婆芦,很明顯抓谴,這種緩存策略相當于是延長了一個HTTP請求的時間暮蹂,并增加了用于緩存請求內(nèi)容的內(nèi)存和磁盤空間,而優(yōu)點是降低了上游服務器的負擔癌压,將負擔更多的放在了自己身上
但是Nginx的這個策略同時也大大提高了效率更降低了上游服務器的負擔仰泻,比如一個場景是一個客戶端想要上傳1G的文件,這個時候如果是別的一些反向代理服務器滩届,則在剛與客戶端建立連接還沒有開始接收包體的時候集侯,就開始向上游服務器進行發(fā)起連接,因為客戶端和反向代理服務器之間基本都是走外網(wǎng)帜消,這個時間加上自身網(wǎng)絡情況棠枉,上傳1G大小的文件通常是一個很耗時的操作,這個時候泡挺,這些反向代理服務器就要一直保持著和客戶端的關系辈讶,又要保持著和上游服務器的關系,這樣一個上傳文件操作就成了一個既耗時又耗資源的一個操作娄猫,而這個時候Nginx和客戶端建立連接之后完整地接收包體之后贱除,通過內(nèi)網(wǎng)與上游服務器之間建立連接,這個速度和資源損耗就遠遠小于其余一些反向代理服務器了
在介紹nginx反向代理之前媳溺,搭了一個小型的tomcat集群月幌,這樣的話就可以通過nginx做反向代理服務器,并且使用負載均衡策略悬蔽,向上游的兩臺服務器按照指定的權重策略進行分發(fā)請求
搭建Tomcat服務器集群
首先扯躺,熟悉基于J2EE規(guī)范以及使用Spring框架開發(fā)的開發(fā)者應該都接觸過Tomcat這種并發(fā)量適中的小型web應用服務器,可是蝎困,如果有一天录语,你的項目訪問量,甚至說并發(fā)量到達了一定的級別禾乘,你會如何處理這種情況钦无,原始的架構(gòu)只是單Tomcat服務器,但是這種結(jié)構(gòu)肯定不足以支撐對整個后端服務的運營盖袭,這個時候怎么辦失暂,首先要想到的就是在有限的一臺服務器上鼓搗一個Tomcat集群,讓多臺Tomcat同時工作鳄虱,并且使用nginx作為反向代理服務器弟塞,配置負載均衡策略,這樣去解決單臺Tomcat負擔過大訪問量的單臺服務器瓶頸
簡易搭建Tomcat集群
-
首先需要確保自己的電腦或者服務器上有安裝過后的兩臺Tomcat服務器
我為這兩臺服務器分別起名為main以及secoundary便于區(qū)分拙已,并且修改了webapps中ROOT文件夾下的圖標决记,這樣的話一會兒在測試的環(huán)節(jié)上就能區(qū)分出nginx分發(fā)請求到了哪一臺上游服務器
-
修改/etc/profile
添加如下字段
-
修改secondary中/bin/catalina.sh文件,注意這里不要修改main中的catalina.sh
在OS結(jié)點下添加如下信息倍踪,使secondary開啟的時候使用/ect/profile中配置的第二條配置啟動
-
修改secondary中conf/server.xml
找到Server結(jié)點修改為系宫,main中Server結(jié)點端口為8005
-
修改Connector結(jié)點索昂,并且為了防止亂碼增加URIEncoding屬性,main為8080默認端口
-
修改AJP端口
AJP Connector
The AJP Connector element represents a Connector component that communicates with a web connector via the AJP protocol.
AJP連接器可以通過AJP協(xié)議和一個web容器進行交互當你想讓Apache和Tomcat結(jié)合并且你想讓Apache處理靜態(tài)內(nèi)容的時候用AJP扩借,或者你想利用Apache的SSL處理能力時
特殊于HTTP Connector椒惨,AJP還可以與engine元素上的jvmRoute結(jié)合使用來實現(xiàn)負載均衡功能
配置nginx.conf
簡單說一下這一段的配置
-
upstream結(jié)點
upstream結(jié)點用來配置上游服務器ip以及端口,用于nginx轉(zhuǎn)發(fā)使用潮罪,在這里這個www.dzjissz.com域名是在本地hosts中配置指向127.0.0.1的域名康谆,所以就相當于指向本地服務器ip
-
server結(jié)點中的server_name
簡單地來說,location塊需要結(jié)合server_name和location后的uri進行匹配嫉到,并且根據(jù)location塊中的proxy_pass配置確定轉(zhuǎn)發(fā)的upstream結(jié)點
這一段nginx的配置主要就是當用戶通過www.dzjissz.com這個域名作為url訪問服務的時候沃暗,nginx匹配到了這個請求,并且向上游兩個開啟的8080和9080的tomcat服務器進行轉(zhuǎn)發(fā)何恶,因為沒有指定權重孽锥,所以兩臺服務器的權重weight默認都為1, 我們來看一下效果
可以看出當使用localhost訪問服務的時候,相當于www.dzjissz.com作為url進行請求细层,可以看到nginx將請求轉(zhuǎn)發(fā)到了兩臺開啟在不同端口的tomcat服務器惜辑。
到這里簡單的tomcat集群也就搭建完成了,修改完配置文件和環(huán)境變量文件記得使其生效今艺,否則等于啥都沒干