Nginx
Nginx常用功能
- Http代理,反向代理:作為web服務(wù)器最常用的功能之一,尤其是反向代理。

Nginx在做反向代理時,提供性能穩(wěn)定,并且能夠提供配置靈活的轉(zhuǎn)發(fā)功能。Nginx可以根據(jù)不同的正則匹配,采取不同的轉(zhuǎn)發(fā)策略,比如圖片文件結(jié)尾的走文件服務(wù)器,動態(tài)頁面走web服務(wù)器,只要你正則寫的沒問題,又有相對應的服務(wù)器解決方案,你就可以隨心所欲的玩。并且Nginx對返回結(jié)果進行錯誤頁跳轉(zhuǎn),異常判斷等。如果被分發(fā)的服務(wù)器存在異常,他可以將請求重新轉(zhuǎn)發(fā)給另外一臺服務(wù)器,然后自動去除異常服務(wù)器。
- 負載均衡


Nginx提供的負載均衡策略有2種:內(nèi)置策略和擴展策略。內(nèi)置策略為輪詢,加權(quán)輪詢,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用于設(shè)置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一直是后端服務(wù)的一個瓶頸,如果分配的worker進程都是在執(zhí)行阻塞式的IO服務(wù),那么這個時候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方式設(shè)置資源路徑比如說一條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配置一個反向代理服務(wù)器
反向代理(reverse proxy)方式是指用代理服務(wù)器來接受Internet上的連接請求,然后根據(jù)請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)中的上游服務(wù)器,并將從上有服務(wù)器上得到的結(jié)果返回Internet上請求連接的客戶端,此時代理服務(wù)器對外的表現(xiàn)就是一個web服務(wù)器,充當反向代理服務(wù)器也是nginx的通常用法
一般來說如果nginx作為反向代理服務(wù)器,接收到的請求若是針對靜態(tài)文件,則直接通過nginx將請求映射到本地的靜態(tài)資源上,如果需要動態(tài)的結(jié)果,即發(fā)出的是一條動態(tài)的請求,則需要繼續(xù)反向代理到真正的web服務(wù)器
當客戶端發(fā)來HTTP請求的時候,Nginx并不會立刻轉(zhuǎn)發(fā)到上游服務(wù)器,而是先把用戶的請求(包括HTTP包體)完整地接收到Nginx所在服務(wù)器的硬盤或者內(nèi)存中,然后再向上游服務(wù)器發(fā)起連接,把緩存的客戶端請求轉(zhuǎn)發(fā)到上游服務(wù)器,而其余的一些反向代理服務(wù)器采用的策略是邊接收客戶端的請求,邊進行轉(zhuǎn)發(fā)到上游服務(wù)器
Nginx這中工作方式存在一個明顯的缺點,很明顯,這種緩存策略相當于是延長了一個HTTP請求的時間,并增加了用于緩存請求內(nèi)容的內(nèi)存和磁盤空間,而優(yōu)點是降低了上游服務(wù)器的負擔,將負擔更多的放在了自己身上
但是Nginx的這個策略同時也大大提高了效率更降低了上游服務(wù)器的負擔,比如一個場景是一個客戶端想要上傳1G的文件,這個時候如果是別的一些反向代理服務(wù)器,則在剛與客戶端建立連接還沒有開始接收包體的時候,就開始向上游服務(wù)器進行發(fā)起連接,因為客戶端和反向代理服務(wù)器之間基本都是走外網(wǎng),這個時間加上自身網(wǎng)絡(luò)情況,上傳1G大小的文件通常是一個很耗時的操作,這個時候,這些反向代理服務(wù)器就要一直保持著和客戶端的關(guān)系,又要保持著和上游服務(wù)器的關(guān)系,這樣一個上傳文件操作就成了一個既耗時又耗資源的一個操作,而這個時候Nginx和客戶端建立連接之后完整地接收包體之后,通過內(nèi)網(wǎng)與上游服務(wù)器之間建立連接,這個速度和資源損耗就遠遠小于其余一些反向代理服務(wù)器了
在介紹nginx反向代理之前,搭了一個小型的tomcat集群,這樣的話就可以通過nginx做反向代理服務(wù)器,并且使用負載均衡策略,向上游的兩臺服務(wù)器按照指定的權(quán)重策略進行分發(fā)請求
搭建Tomcat服務(wù)器集群
首先,熟悉基于J2EE規(guī)范以及使用Spring框架開發(fā)的開發(fā)者應該都接觸過Tomcat這種并發(fā)量適中的小型web應用服務(wù)器,可是,如果有一天,你的項目訪問量,甚至說并發(fā)量到達了一定的級別,你會如何處理這種情況,原始的架構(gòu)只是單Tomcat服務(wù)器,但是這種結(jié)構(gòu)肯定不足以支撐對整個后端服務(wù)的運營,這個時候怎么辦,首先要想到的就是在有限的一臺服務(wù)器上鼓搗一個Tomcat集群,讓多臺Tomcat同時工作,并且使用nginx作為反向代理服務(wù)器,配置負載均衡策略,這樣去解決單臺Tomcat負擔過大訪問量的單臺服務(wù)器瓶頸
簡易搭建Tomcat集群
-
首先需要確保自己的電腦或者服務(wù)器上有安裝過后的兩臺Tomcat服務(wù)器
我為這兩臺服務(wù)器分別起名為main以及secoundary便于區(qū)分,并且修改了webapps中ROOT文件夾下的圖標,這樣的話一會兒在測試的環(huán)節(jié)上就能區(qū)分出nginx分發(fā)請求到了哪一臺上游服務(wù)器
解壓后的兩臺Tomcat服務(wù)器 -
修改/etc/profile
添加如下字段
/etc/profile -
修改secondary中/bin/catalina.sh文件,注意這里不要修改main中的catalina.sh
在OS結(jié)點下添加如下信息,使secondary開啟的時候使用/ect/profile中配置的第二條配置啟動
修改catalina.sh -
修改secondary中conf/server.xml
找到Server結(jié)點修改為,main中Server結(jié)點端口為8005
修改Server結(jié)點 -
修改Connector結(jié)點,并且為了防止亂碼增加URIEncoding屬性,main為8080默認端口
修改Connector結(jié)點
-
修改AJP端口
修改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é)點用來配置上游服務(wù)器ip以及端口,用于nginx轉(zhuǎn)發(fā)使用,在這里這個www.dzjissz.com域名是在本地hosts中配置指向127.0.0.1的域名,所以就相當于指向本地服務(wù)器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訪問服務(wù)的時候,nginx匹配到了這個請求,并且向上游兩個開啟的8080和9080的tomcat服務(wù)器進行轉(zhuǎn)發(fā),因為沒有指定權(quán)重,所以兩臺服務(wù)器的權(quán)重weight默認都為1, 我們來看一下效果


可以看出當使用localhost訪問服務(wù)的時候,相當于www.dzjissz.com作為url進行請求,可以看到nginx將請求轉(zhuǎn)發(fā)到了兩臺開啟在不同端口的tomcat服務(wù)器。
到這里簡單的tomcat集群也就搭建完成了,修改完配置文件和環(huán)境變量文件記得使其生效,否則等于啥都沒干





