Nginx基礎

一、Nginx是什麼
Nginx是一款自由的、開源的、高性能HTTP服務器和反向代理服務器;也是一個IMAP、POP3、SMTP代理服務器;也就是說Nginx本身就可以託管網站(類似於Tomcat一樣),進行Http服務處理,也可以作爲反向代理服務器使用。
Nginx 解決了服務器的C10K(就是在一秒之內連接客戶端的數目爲10k即1萬)問題。
它的設計不像傳統的服務器那樣使用線程處理請求,而是一個更加高級的機制—事件驅動機制,是一種異步事件驅動結構
nginx 是用來做請求分發的,其實就是爲多個tomcat/jboss應用服務器集羣做的請求代理。
假設10W的併發10個服務器處理,在nginx.conf裏面可以配置被請求的權重。從而減輕服務器的被請求的壓力.

負載平衡:併發請求很大時,分發請求給多個服務器處理,減輕服務器壓力
正向代理服務器:
一般指局域網內部的機器通過代理服務器發送請求到互聯網上的服務器,代理服務器一般作用在客戶端

反向代理服務器:
反向代理服務器作用在服務器端,它在服務器端接收客戶端的請求,然後將請求分發給具體的服務器進行處理,然後再將服務器的相應結果反饋給客戶端。Nginx就是一個反向代理服務器軟件。

工作原理:
客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端。
正向代理:客戶端必須設置正向代理服務器IP地址和端口號。
反向代理:客戶端不需要進行任何特別的設置,對於客戶端而言代理服務器就像是原始服務器。

二、服務器類型:
1、Web服務器:提供Http的訪問,例如Nginx、Apache、IIS等
2、應用程序服務器:能夠用於應用程序的運行;
3、代理服務器:作用在客戶端,用於客戶端訪問服務端的代理
4、反向代理服務器:作用在服務端,用於接受客戶端的訪問,代理給服務端轉發
5、後臺服務器:普通用的服務器
6、CDN緩存服務器:它是緩存服務器的角色,而且是反向代理的應用

三、Nginx的特點
1、跨平臺:可以在大多數Unix like 系統編譯運行,也有Windows的移植版本。
  2、配置異常簡單:非常的簡單,易上手。
  3、非阻塞、高併發連接:得益於Nginx採用了最新的epoll事件處理模型(消息隊列)。
  4、Nginx代理和後端Web服務器間無需長連接;
  5、Nginx接收用戶請求是異步的,即先將用戶請求全部接收下來,再一次性發送到後端Web服務器,極大減輕後端Web服務器的壓力。
  6、邊接邊響應:發送響應報文時,是邊接收來自後端Web服務器的數據,邊發送給客戶端。
  7、網絡依賴性低:只要能夠ping通就可以實施負載均衡,而且可以有效區分內網、外網流量。
  8、支持內置服務器檢測。Nginx能夠根據應用服務器處理頁面返回的狀態碼、超時信息等檢測服務器是否出現故障,並及時返回錯誤的請求重新提交到其它節點上。
  9、採用Master/worker多進程工作模式
  10、內存消耗小、成本低廉(比F5硬件負載均衡器廉價太多)、節省帶寬、穩定性高等特點。

四、Nginx的模塊
1、CoreModule用於控制Nginx服務器的基本功能
2、EventsModule用於控制Nginx如何處理連接。影響性能
3、HttpCoreModule提供HTTP訪問Nginx服務器,不能缺少

五、常用功能
1、靜態HTTP服務器
Nginx是一個HTTP服務器,可以將服務器上的靜態文件(如HTML、圖片)通過HTTP協議展現給客戶端。配置:
server {
    listen 80; # 端口號
    location / {
        root /usr/share/nginx/html; # 靜態文件路徑
    }
}
2、反向代理服務器
反向代理服務器作用在服務器端,它在服務器端接收客戶端的請求,然後將請求分發給具體的服務器進行處理,然後再將服務器的相應結果反饋給客戶端。配置:
server {
    listen 80;
    location / {
        proxy_pass http://192.168.20.1:8080; # 應用服務器HTTP地址
    }
}
3、負載均衡
將同一個應用部署在多臺服務器上,將大量用戶的請求分配給多臺機器處理。同時帶來的好處是,其中一臺服務器萬一掛了,只要還有其他服務器正常運行,就不會影響用戶使用。配置:
upstream myapp {
    server 192.168.20.1:8080; # 應用服務器1
    server 192.168.20.2:8080; # 應用服務器2
}
server {
    listen 80;
    location / {
        proxy_pass http://myapp;
    }
}


4、訪問不同服務器,只需配一個url
若訪問不同的服務器,可以通過Nginx配置轉發,只需配一個url。多個請求時,會根據路徑分發給對應的服務器。
5、虛擬主機
將www.aaa.com和www.bbb.com兩個網站部署在同一臺服務器上,兩個域名解析到同一個IP地址,但是用戶通過兩個域名卻可以打開兩個完全不同的網站,互相不影響,就像訪問兩個服務器一樣,所以叫兩個虛擬主機。配置:
server {
    listen 80default_server;
    server_name _;
    return444; # 過濾其他域名的請求,返回444狀態碼
}
server {
    listen 80;
    server_name www.aaa.com; # www.aaa.com域名
    location / {
        proxy_pass http://localhost:8080; # 對應端口號8080
    }
}
server {
    listen 80;
    server_name www.bbb.com; # www.bbb.com域名
    location / {
        proxy_pass http://localhost:8081; # 對應端口號8081
    }
}
6、FastCGI
Nginx本身不支持PHP等語言,但是它可以通過FastCGI來將請求扔給某些語言或框架處理(例如PHP、Python、Perl)。
server {
    listen 80;
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /PHP文件路徑$fastcgi_script_name; # PHP文件路徑
        fastcgi_pass 127.0.0.1:9000; # PHP-FPM地址和端口號
        # 另一種方式:fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

六、 處理請求
  首先,Nginx在啓動時,會解析配置文件,得到需要監聽的端口與IP地址,然後在Nginx的master進程裏面,先初始化好這個監控的 socket(創建socket,設置addrreuse等選項,綁定到指定的IP地址端口,再listen),然後再fork(一個現有進程可以調用 fork函數創建一個新進程。由fork創建的新進程被稱爲子進程)出多個子進程出來,然後子進程會競爭accept新的連接。
  此時,客戶端就可以向Nginx發起連接了。當客戶端與Nginx進行三次握手,與Nginx建立好一個連接後,某一個子進程會accept成功,得到這個建立好的連接的socket,然後創建Nginx對連接的封裝,即ngx_connection_t結構體。
  接着,設置讀寫事件處理函數並添加讀寫事件來與客戶端進行數據的交換。最後,Nginx或客戶端來主動關掉連接,到此,一個連接就結束了。


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