Nginx
簡介
Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。
其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是佔有內存少,併發能力強,事實上nginx的併發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
優點
1、可以高併發連接
官方測試Nginx能夠支撐5萬併發連接,實際生產環境中可以支撐2~4萬併發連接數。
原因,主要是Nginx使用了最新的epoll(Linux2.6內核)和kqueue(freeBSD)網路I/O模型,而Apache使用的是傳統的Select模型,其比較穩定的Prefork模式爲多進程模式,需要經常派生子進程,所以消耗的CPU等服務器資源,要比Nginx高很多。2、內存消耗少
Nginx+PHP(FastCGI)服務器,在3萬併發連接下,開啓10個Nginx進程消耗150MB內存,15MB10=150MB,開啓的64個PHP-CGI進程消耗1280內存,20MB64=1280MB,加上系統自身消耗的內存,總共消耗不到2GB的內存。 如果服務器的內存比較小,完全可以只開啓25個PHP-CGI進程,這樣PHP-CGI消耗的總內存數才500MB。
3、成本低廉
購買F5BIG-IP、NetScaler等硬件負載均衡交換機,需要十多萬到幾十萬人民幣,而Nginx爲開源軟件,採用的是2-clause BSD-like協議,可以免費試用,並且可用於商業用途。
BSD開源協議是一個給使用者很大自由的協議,協議指出可以自由使用、修改源代碼、也可以將修改後的代碼作爲開源或專用軟件再發布。4、配置文件非常簡單
網絡和程序一樣通俗易懂,即使,非專用系統管理員也能看懂。5、支持Rewrite重寫
能夠根據域名、URL的不同,將http請求分到不同的後端服務器羣組。6、內置的健康檢查功能
如果NginxProxy後端的某臺Web服務器宕機了,不會影響前端的訪問。7、節省帶寬
支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭。8、穩定性高
用於反向代理,宕機的概率微乎其微。9、支持熱部署
Nginx支持熱部署,它的自動特別容易,並且,幾乎可以7天*24小時不間斷的運行,即使,運行數個月也不需要重新啓動,還能夠在不間斷服務的情況下,對軟件版本進行升級。
環境搭建
下載安裝環境
pcre-devel是使用pcre開發的一個二次開發庫。nginx也需要此庫。
yum install -y pcre pcre-devel
c.zlib庫提供了很多種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,所以需要在linux上安裝zlib庫。
yum install -y zlib zlib-devel
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
nginx不僅支持http協議,還支持https(即在ssl協議上傳輸http),所以需要在linux安裝openssl庫。
yum install -y openssl openssl-devel
安裝編譯插件
yum -y install gcc-c++
上傳 nginx 到 linux 系統
上傳路徑爲 /usr/local/
解壓縮, 並進入解壓文件夾
配置安裝路徑
源碼的安裝一般由3個步驟組成:配置(configure)、編譯(make)、安裝(makeinstall)。
Configure是一個可執行腳本,它有很多選項,在待安裝的源碼路徑下使用命令./configure–help輸出詳細的選項列表。
其中–prefix選項是配置安裝的路徑,如果不配置該選項,安裝後可執行文件默認放在/usr/local/bin,庫文件默認放在/usr/local/lib,配置文件默認放在/usr/local/etc,其它的資源文件放在/usr/local/share,比較凌亂。
如果配置–prefix,如:
# ./configure --prefix=/usr/local/test
此處爲
cd nginx-1.6.2
./configure --prefix=/usr/local/nginx
可以把所有資源文件放在/usr/local/test的路徑中,不會雜亂。
用了—prefix選項的另一個好處是卸載軟件或移植軟件。當某個安裝的軟件不再需要時,只須簡單的刪除該安裝目錄,就可以把軟件卸載得乾乾淨淨;移植軟件只需拷貝整個目錄到另外一個機器即可(相同的操作系統)。
當然要卸載程序,也可以在原來的make目錄下用一次make uninstall,但前提是make文件指定過uninstall。
編譯和安裝
make && make install
安裝成功
進入到安裝目錄
cd ..
cd nginx
ls
# 顯示爲四個目錄 conf html logs sbin
其中 啓動命令爲 sbin 中的 nginx 命令
啓動
/usr/local/nginx/sbin/nginx
沒有報錯 就說明 安裝成功
# 使用 進程命令, 驗證是否安裝成功
ps -ef | grep nginx
開放80端口號, 外網可訪問
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
/etc/rc.d/init.d/iptables status
編輯防火牆文件
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 81 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 82 -j ACCEPT
輸入網址 可以直接訪問
關閉命令 (-s stop)
/usr/local/nginx/sbin/nginx -s stop
推薦使用 -s quit
此方式停止步驟是待nginx進程處理任務完畢進行停止。從容關閉
重啓命令
/usr/local/nginx/sbin/nginx -s reload
虛擬主機配置
修改配置文件
啓動 nginx 之後,
查看 安裝目錄
(發現生成了很多目錄)
ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
找到 conf 目錄
cd conf
ls
fastcgi.conf fastcgi_params koi-utf mime.types nginx.conf
scgi_params uwsgi_params win-utf
fastcgi.conf.default fastcgi_params.default koi-win mime.types.default nginx.conf.default scgi_params.default uwsgi_params.default
核心配置文件爲 (nginx.conf )
vim nginx.conf
nginx.conf配置文件
Nginx配置文件主要分成四部分:
main(全局設置) | main部分設置的指令將影響其它所有部分的設置; |
server(主機設置) | server部分的指令主要用於指定虛擬主機域名、IP和端口; |
upstream(上游服務器設置,主要爲反向代理、負載均衡相關配置) | upstream的指令用於設置一系列的後端服務器,設置反向代理及後端服務器的負載均衡; |
location(URL匹配特定位置後的設置) | location部分用於匹配網頁位置(比如,根目錄“/”,“/images”,等等)。 |
他們之間的關係式:server繼承main,location繼承server;
upstream既不會繼承指令也不會被繼承。它有自己的特殊指令,不需要在其他地方的應用。
server虛擬主機
參考網址
https://www.cnblogs.com/connect/p/nginx-vhost.html
虛擬主機是一種特殊的軟硬件技術,它可以將網絡上的每一臺計算機分成多個虛擬主機,每個虛擬主機可以獨立對外提供www服務,這樣就可以實現一臺主機對外提供多個web服務,每個虛擬主機之間是獨立的,互不影響的。
通過nginx可以實現虛擬主機的配置,nginx支持三種類型的虛擬主機配置,
1、基於ip的虛擬主機
如果是使用一臺計算機測試需要爲虛擬機添加ip
ifconfig ens33:1 192.168.204.151
ifconfig ens33:2 192.168.204.152
配置文件示例
server {
listen 192.168.204.151:80;
root /var/wwwroot/site1;
index index.html;
location / {
}
}
server {
listen 192.168.204.152:80;
root /var/wwwroot/site2;
index index.html;
location / {
}
}
2、基於域名的虛擬主機
如果是使用一臺計算機測試需要修改 配置文件
(C:\Windows\System32\drivers\etc\ 修改hosts
文件)
server {
listen 80;
server_name site1.test.com;
root /var/wwwroot/site1;
index index.html;
location / {
}
}
server {
listen 80;
server_name site2.test.com;
root /var/wwwroot/site2;
index index.html;
location / {
}
}
3、基於端口的虛擬主機
server {
listen 8081;
root /var/wwwroot/site1;
index index.html;
location / {
}
}
server {
listen 8082;
root /var/wwwroot/site2;
index index.html;
location / {
}
}
http服務上支持若干虛擬主機。每個虛擬主機一個對應的server配置項,配置項裏面包含該虛擬主機相關的配置。在提供mail服務的代理時,也可以建立若干server。每個server通過監聽地址或端口來區分。
listen
監聽端口,默認80,小於1024的要以root啓動。可以爲listen *:80、listen 127.0.0.1:80等形式。
server_name
服務器名,如localhost、www.example.com,可以通過正則匹配。
反向代理
正向代理
正向代理就是我們平常使用的那種代理軟件的效果,我們將自己的請求發給代理服務器,然後再由代理服務器發送給目標服務器;
客戶端想要訪問一個服務器,但是它可能無法直接訪問這臺服務器,這時候這可找一臺可以訪問目標服務器的另外一臺服務器,而這臺服務器就被當做是代理人的角色 ,稱之爲代理服務器,於是客戶端把請求發給代理服務器,由代理服務器獲得目標服務器的數據並返回給客戶端。客戶端是清楚目標服務器的地址的,而目標服務器是不清楚來自客戶端,它只知道來自哪個代理服務器,所以正向代理可以屏蔽或隱藏客戶端的信息。
反向代理
反向代理,顧名思義,方向相反,當代理服務器收到請求後,依照某種規則,轉發給不同的服務器。
從上面的正向代理,你會大概知道代理服務器是爲客戶端作代理人,它是站在客戶端這邊的。其實反向代理就是代理服務器爲服務器作代理人,站在服務器這邊,它就是對外屏蔽了服務器的信息,常用的場景就是多臺服務器分佈式部署,像一些大的網站,由於訪問人數很多,就需要多臺服務器來解決人數多的問題,這時這些服務器就由一個反向代理服務器來代理,客戶端發來請求,先由反向代理服務器,然後按一定的規則分發到明確的服務器,而客戶端不知道是哪臺服務器。常常用nginx來作反向代理。
反向代理環境配置
案例 兩臺虛擬機中的 兩個tomcat服務通過nginx反向代理
向兩臺虛擬機中分別配置 Tomcat 服務器,並開啓服務
分別標識出 兩臺虛擬機中的tomcat 頁面 作出區分
默認配置
server {
listen 80;
server_name localhost;
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
修改添加爲
server {
listen 81;
server_name localhost;
location / {
#域名aaa.test.com的請求全部轉發到tomcat_server1即tomcat1服務上
proxy_pass http://192.168.3.163:8080;
#歡迎頁面,按照從左到右的順序查找頁面
index index.jsp index.html index.htm;
}
}
server {
listen 82;
server_name localhost;
location / {
#域名bbb.test.com的請求全部轉發到tomcat_server2即tomcat2服務上
proxy_pass http://192.168.3.164:8080;
index index.jsp index.html index.htm;
}
}
測試使用端口的虛擬主機配置 (需要開啓 nginx 服務器防火牆的的 81和82端口)
分別訪問
nginx :81 能夠進入到 http://192.168.3.163:8080
nginx :82 能夠進入到 http://192.168.3.164:8080
反向代理設置成功
動靜分離測試
163 服務器下新建demo.jsp 頁面
<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title><%=request.getServletContext().getServerInfo() %></title>
<body>
<h1>192.168.3.163</h1>
<%
String addr = request.getRemoteAddr();
out.write("遠程地址: "+addr);
%>
</body>
</html>
164 服務器下新建 demo.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>192.168.3.164 html 靜態頁面</h1>
</body>
</html>
nginx 服務器環境設置
server {
listen 80;
server_name localhost;
# 當用戶訪問以.jsp 結尾的文件的時候, 跳轉到 163 服務器
location ~\.jsp$ {
proxy_pass http://192.168.3.163:8080;
index index.jsp index.html index.htm;
}
# 當用戶訪問以.html 結尾的文件的時候, 跳轉到 164 服務器
location ~\.html$ {
proxy_pass http://192.168.3.164:8080;
index index.html index.htm;
}
}
含義爲 ,
當用戶訪問以.jsp 結尾的文件的時候, 跳轉到 163 服務器
當用戶訪問以.html 結尾的文件的時候, 跳轉到 164 服務器
測試
String addr = request.getRemoteAddr();
獲取請求對象的 ip地址
測試得出結論 : 遠程主機 , 並非客戶機, 而是 nginx 主機,
相當於 是nginx 服務器代理客戶機進行訪問
網址抽取
upstream tomcat_server1 {
server 192.168.101.5:8080;
}
# 配置一個代理服務器
upstream tomcat_server2 {
server 192.168.101.6:8080;
}
在之後的 localtion中
location ~\.html$ {
# 使用外部配置的服務器地址
proxy_pass http://tomcat_server1;
index index.html index.htm;
}
負載均衡
含義
負載均衡 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。
負載均衡,英文名稱爲Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
當 用戶量過多的時候, 一個tomcat 無法承載過多請求.
nginx作爲負載均衡服務器,用戶請求先到達nginx,再由nginx根據負載配置將請求轉發至 tomcat服務器。
案例實現
服務器環境
一個nginx 服務器
192.168.3.126
兩個tomcat 服務器
192.168.3.163
192.168.3.164
當用戶訪問 nginx 的時候, 由nginx 負責切換不同的 tomcat 服務器,來處理用戶請求
nginx.conf配置
upstream tomcat_server{
server 192.168.3.163:8080 weight=1;
server 192.168.3.164:8080 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat_server;
index index.jsp index.html index.htm;
}
}
版本問題解決
報錯如下
The character [_] is never valid in a domain name.
nginx配置文件中配置upstream時用了“_”字符,如上用的tomcat_server,直接報錯了。
改成tomcatserver,即不使用“_”字符就好了。主要還是版本原因
負載均衡策略
1、熱備:如果你有2臺服務器,當一臺服務器發生事故時,才啓用第二臺服務器給提供服務。服務器處理請求的順序:AAAAAA突然A掛啦,BBBBBBBBBBBBBB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #熱備
}
2、輪詢:nginx默認就是輪詢其權重都默認爲1,服務器處理請求的順序:ABABABABAB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
3、加權輪詢:跟據配置的權重的大小而分發給不同服務器不同數量的請求。如果不設置,則默認爲1。下面服務器的請求順序爲:ABBABBABBABBABB…
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
4、ip_hash:nginx會讓相同的客戶端ip請求相同的服務器。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
設備狀態
down 表示單前的server暫時不參與負載
weight 權重,默認爲1。 weight越大,負載的權重就越大。
max_fails 允許請求失敗的次數默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
fail_timeout max_fails次失敗後,暫停的時間。
backup 備用服務器, 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
後續
使用keepalived+nginx 實現 負載均衡 + 高可用
keepalived
keepalived是集羣管理中保證集羣高可用的一個服務軟件,用來防止單點故障。 Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。
nginx是以多進程的方式來工作的。
nginx在啓動後,會有一個master進程和多個worker進程
master進程主要用來管理worker進程: