05- Nginx

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進程:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章