Nginx 入門知識點詳解

NGINX聯合創始人安德魯·阿列克謝夫(Andrew Alexeev)曾說:NGINX是爲對Apache性能不滿意的人而構建的。隨着Internet需求的變化,Web服務器的工做也在變化。NGINX的構建比以往任什麼時候候都更有效率,更可擴展,更安全,更強大。javascript

本文提供了Nginx的基本概念及知識。以開發者必備的Nginx基礎知識爲主,羅列了一些Nginx教程,但願對你們有所幫助。css

一.環境html

服務器版本:CentOS 7.2java

爲了保證學習階段不遇到奇怪的事情,請保證如下四點:node

  1. 確認系統網絡
  2. 確認yum可用
  3. 確認關閉iptables
  4. 確認停用selinux
#查看iptables狀態
systemctl status firewalld.service
#關閉防火牆(臨時關閉)
systemctl stop firewalld.service
#查看SELinux狀態 
getenforce#臨時關閉SELinux 
setenforce 0

安裝一些系統基本工具,正常狀況系統都會自帶linux

yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim

二.基本概念nginx

2.1Nginx是什麼?c++

Nginx是一個高性能的http和反向代理服務器,其特色是佔用內存小,併發能力強。Nginx專爲性能優化而開發,性能是其最重要的考量,能經受高負載的考驗,有報告代表能支持高達50000個併發鏈接數。git

2.2正向代理與反向代理github

爲了便於理解,首先先來了解一下一些基礎知識,nginx是一個高性能的反向代理服務器那麼什麼是反向代理呢?

代理是在服務器和客戶端之間假設的一層服務器,代理將接收客戶端的請求並將它轉發給服務器,而後將服務端的響應轉發給客戶端。

不論是正向代理仍是反向代理,實現的都是上面的功能。若是你對OSI 七層模型與 TCP/IP 四層模型不是很熟悉能夠再回顧下。

正向代理

正向代理(forward)意思是一個位於客戶端和原始服務器 (origin server) 之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標 (原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。

正向代理是爲咱們服務的,即爲客戶端服務的,客戶端能夠根據正向代理訪問到它自己沒法訪問到的服務器資源。

正向代理對咱們是透明的,對服務端是非透明的,即服務端並不知道本身收到的是來自代理的訪問仍是來自真實客戶端的訪問。

反向代理

反向代理(Reverse Proxy)方式是指以代理服務器來接受 internet 上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給 internet 上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。

反向代理是爲服務端服務的,反向代理能夠幫助服務器接收來自客戶端的請求,幫助服務器作請求轉發,負載均衡等。

反向代理對服務端是透明的,對咱們是非透明的,即咱們並不知道本身訪問的是代理服務器,而服務器知道反向代理在爲他服務。

2.3負載均衡

若是請求數過大,單個服務器解決不了,咱們增長服務器的數量,而後將請求分發到各個服務器上,將原先請求集中到單個服務器的狀況改成請求分發到多個服務器上,就是負載均衡。

Upstream 指定後端服務器地址列表,在 server 中攔截響應請求,並將請求轉發到 Upstream 中配置的服務器列表。

`upstream balanceServer {
  server 10.1.22.33:12345;
    server 10.1.22.34:12345;
server 10.1.22.35:12345;
}
server { 
    server_name  fe.server.com;
    listen 80;
    location /api {
        proxy_pass http://balanceServer;
  }
}`

上面的配置只是指定了 nginx 須要轉發的服務端列表,並無指定分配策略。

默認狀況下采用的是輪詢策略,將全部客戶端請求輪詢分配給服務端。這種策略是能夠正常工做的,可是若是其中某一臺服務器壓力太大,出現延遲,會影響全部分配在這臺服務器下的用戶。

Nginx支持的負載均衡調度算法方式以下:

weight輪詢(默認,經常使用):接收到的請求按照權重分配到不一樣的後端服務器,即便在使用過程當中,某一臺後端服務器宕機,Nginx會自動將該服務器剔除出隊列,請求受理狀況不會受到任何影響。這種方式下,能夠給不一樣的後端服務器設置一個權重值(weight),用於調整不一樣的服務器上請求的分配率;權重數據越大,被分配到請求的概率越大;該權重值,主要是針對實際工做環境中不一樣的後端服務器硬件配置進行調整的。ip_hash(經常使用):每一個請求按照發起客戶端的ip的hash結果進行匹配,這樣的算法下一個固定ip地址的客戶端總會訪問到同一個後端服務器,這也在必定程度上解決了集羣部署環境下session共享的問題。

fair:智能調整調度算法,動態的根據後端服務器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的服務器分配到請求的機率高,響應時間長處理效率低的服務器分配到的請求少;結合了前二者的優勢的一種調度算法。可是須要注意的是Nginx默認不支持fair算法,若是要使用這種調度算法,請安裝upstream_fair模塊。url_hash:按照訪問的url的hash結果分配請求,每一個請求的url會指向後端固定的某個服務器,能夠在Nginx做爲靜態服務器的狀況下提升緩存效率。一樣要注意Nginx默認不支持這種調度算法,要使用的話須要安裝Nginx的hash軟件包。

2.4動靜分離

爲了加快服務器的解析速度,能夠把動態頁面和靜態頁面交給不一樣的服務器來解析,加快解析速度,下降原來單個服務器的壓力。

2.5Nginx經常使用命令

# 快速關閉Nginx,可能不保存相關信息,並迅速終止web服務
nginx -s stop
# 平穩關閉Nginx,保存相關信息,有安排的結束web服務
nginx -s quit
# 因改變了Nginx相關配置,須要從新加載配置而重載
nginx -s reload
# 從新打開日誌文件
nginx -s reopen
# 爲 Nginx 指定一個配置文件,來代替缺省的
nginx -c filename
# 不運行,而僅僅測試配置文件。nginx 將檢查配置文件的語法的正確性,並嘗試打開配置文件中所引用到的文件
nginx -t
#  顯示 nginx 的版本
nginx -v
# 顯示 nginx 的版本,編譯器版本和配置參數
nginx -V
# 格式換顯示 nginx 配置參數
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua

三.爲何選擇Nginx?

Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP三、SMTP代理服務器;Nginx能夠做爲一個HTTP服務器進行網站的發佈處理,另外Nginx能夠做爲反向代理進行負載均衡的實現。在Nginx網站上,其功能包括:

  • HTTP和HTTPS(TLS / SSL / SNI)
  • 超快速的Web服務器用於靜態內容
  • FastCGI,WSGI,SCGI用於動態內容
  • 具備負載平衡和緩存功能的加速Web代理
  • 不間斷實時二進制升級和配置
  • 壓縮和內容過濾器
  • 虛擬主機
  • FLV和MP4的媒體流
  • 帶寬和鏈接策略
  • 全面的訪問控制
  • 自定義日誌
  • 嵌入式腳本
  • 帶有TLS的SMTP / IMAP / POP3的郵件代理
  • 邏輯,靈活,可擴展的配置
  • 在Linux,FreeBSD,Mac OS X,Solaris和Windows上運行

nginx有以下優點:

1. IO多路複用epoll(IO複用)

如何理解呢?舉個例子吧!
有A、B、C三個老師,他們都遇到一個難題,要幫助一個班級的學生解決課堂做業。
老師A採用從第一排開始一個學生一個學生輪流解答的方式去回答問題,老師A浪費了不少時間,而且有的學生做業尚未完成呢,老師就來了,反反覆覆效率極慢。
老師B是一個忍者,他發現老師A的方法行不通,因而他使用了影分身術,分身出好幾個本身同一時間去幫好幾個同窗回答問題,最後還沒回答完,老師B消耗光了能量累倒了。
老師C比較精明,他告訴學生,誰完成了做業舉手,有舉手的同窗他纔去指導問題,他讓學生主動發聲,分開了「併發」。
這個老師C就是Nginx。

2. 輕量級

  • 功能模塊少 - Nginx僅保留了HTTP須要的模塊,其餘都用插件的方式,後天添加
  • 代碼模塊化 - 更適合二次開發,如阿里巴巴Tengine

3. CPU親和

把CPU核心和Nginx工做進程綁定,把每一個worker進程固定在一個CPU上執行,減小切換CPU的cache miss,從而提升性能。

四.Nginx的安裝

1.本地安裝

  • windows系統:
直接去官網: https://nginx.org/en/download... 下載相應版本便可。
  • mac系統:
$ brew install nginx

2.Linux安裝:

以centOS系統爲例,有下面兩種安裝方式(推薦1)

1.) 經過rpm鏡像源安裝

$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum install -y nginx

2.) 經過依賴包詳細安裝

安裝nginx依賴庫pcre、zlib
$ yum install pcre pcre-devel
$ yum install zlib zlib-devel
若有必要,能夠安裝c++編譯環境和openssl
$ yum install gcc-c++
$ yum install openssl openssl-devel
下載/編譯nginx
$ wget -c https://nginx.org/download/nginx-1.16.0.tar.gz
$ tar -zxvf nginx-1.16.0.tar.gz
# 編譯安裝
$ cd nginx-1.16.0
$ ./configure  # 默認安裝在/usr/local/nginx
$ make && make install
# 建立軟鏈
$ ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
$ nginx -v

五.Nginx配置

#打開主配置文件,若你是用lnmp環境安裝
vim /usr/local/nginx/conf/nginx.conf
----------------------------------------
user                    #設置nginx服務的系統使用用戶
worker_processes        #工做進程數 通常狀況與CPU核數保持一致
error_log               #nginx的錯誤日誌
pid                     #nginx啓動時的pid
events {
    worker_connections    #每一個進程容許最大鏈接數
    use                   #nginx使用的內核模型
}

咱們使用 nginx 的 http 服務,在配置文件 nginx.conf 中的 http 區域內,配置無數個 server ,每個 server 對應這一個虛擬主機或者域名。

http {
    ... ...        #後面再詳細介紹 http 配置項目
    
    server {
        listen 80                          #監聽端口;
        server_name localhost              #地址
        
        location / {                       #訪問首頁路徑
            root /xxx/xxx/index.html       #默認目錄
            index index.html index.htm     #默認文件
        }        
        
        error_page  500 504   /50x.html    #當出現以上狀態碼時重新定義到50x.html
        location = /50x.html {             #當訪問50x.html時
            root /xxx/xxx/html             #50x.html 頁面所在位置
        }        
    }
    
    server {
        ... ...
 } 
}

一個 server 能夠出現多個 location ,咱們對不一樣的訪問路徑進行不一樣狀況的配置
咱們再來看看 http 的配置詳情。

http {
    sendfile  on                  #高效傳輸文件的模式 必定要開啓
    keepalive_timeout   65        #客戶端服務端請求超時時間
    log_format  main   XXX        #定義日誌格式 代號爲main
    access_log  /usr/local/access.log  main     #日誌保存地址 格式代碼 main
}

下面是 nginx 一些配置中經常使用的內置全局變量,你能夠在配置的任何位置使用它們。

六.Nginx實戰

各類開發工具的配置結合實戰來說述,會讓人更易理解。

咱們先實現一個小目標:不考慮複雜的配置,僅僅是完成一個 http 反向代理。

nginx.conf 配置文件以下:

注:_ conf/nginx.conf 是 nginx 的默認配置文件。你也可使用 nginx -c 指定你的配置文件_
#運行用戶
#user somebody;
#啓動進程,一般設置成和cpu的數量相等
worker_processes  1;
#全局錯誤日誌
error_log  D:/Tools/nginx-1.10.1/logs/error.log;
error_log  D:/Tools/nginx-1.10.1/logs/notice.log  notice;
error_log  D:/Tools/nginx-1.10.1/logs/info.log  info;
#PID文件,記錄當前啓動的nginx的進程ID
pid        D:/Tools/nginx-1.10.1/logs/nginx.pid;
#工做模式及鏈接數上限
events {
    worker_connections 1024;    #單個後臺worker process進程的最大併發連接數
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
    #設定mime類型(郵件支持類型),類型由mime.types文件定義
    include       D:/Tools/nginx-1.10.1/conf/mime.types;
    default_type  application/octet-stream;
    #設定日誌
    log_format  main  '[$remote_addr] - [$remote_user] [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log    D:/Tools/nginx-1.10.1/logs/access.log main;
    rewrite_log     on;
    #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
    #必須設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime.
    sendfile        on;
    #tcp_nopush     on;
    #鏈接超時時間
    keepalive_timeout  120;
    tcp_nodelay        on;
    #gzip壓縮開關
    #gzip  on;
    #設定實際的服務器列表
    upstream zp_server1{
        server 127.0.0.1:8089;
    }
    #HTTP服務器
    server {
        #監聽80端口,80端口是知名端口號,用於HTTP協議
        listen       80;
        #定義使用www.xx.com訪問
        server_name  www.helloworld.com;
        #首頁
        index index.html
        #指向webapp的目錄
        root D:01_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebapp;
        #編碼格式
        charset utf-8;
        #代理配置參數
        proxy_connect_timeout 180;
        proxy_send_timeout 180;
        proxy_read_timeout 180;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarder-For $remote_addr;
        #反向代理的路徑(和upstream綁定),location 後面設置映射的路徑
        location / {
            proxy_pass http://zp_server1;
        }
        #靜態文件,nginx本身處理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            root D:01_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebappviews;
            #過時30天,靜態文件不怎麼更新,過時能夠設大一點,若是頻繁更新,則能夠設置得小一點。
            expires 30d;
        }
        #設定查看Nginx狀態的地址
        location /NginxStatus {
            stub_status           on;
            access_log            on;
            auth_basic            "NginxStatus";
            auth_basic_user_file  conf/htpasswd;
        }
        #禁止訪問 .htxxx 文件
        location ~ /.ht {
            deny all;
        }
        #錯誤處理頁面(可選擇性配置)
        #error_page   404              /404.html;
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}
    }
}

好了,讓咱們來試試吧:

  1. 啓動 webapp,注意啓動綁定的端口要和 nginx 中的 upstream 設置的端口保持一致。
  2. 更改 host:在 C:WindowsSystem32driversetc 目錄下的 host 文件中添加一條 DNS 記錄
127.0.0.1 www.helloworld.com
  1. 啓動前文中 startup.bat 的命令
  2. 在瀏覽器中訪問 www.helloworld.com,不出意外,已經能夠訪問了。

搭建文件服務器

有時候,團隊須要歸檔一些數據或資料,那麼文件服務器必不可少。使用 Nginx 能夠很是快速便捷的搭建一個簡易的文件服務。

Nginx 中的配置要點:

  • 將 autoindex 開啓能夠顯示目錄,默認不開啓。
  • 將 autoindex_exact_size 開啓能夠顯示文件的大小。
  • 將 autoindex_localtime 開啓能夠顯示文件的修改時間。
  • root 用來設置開放爲文件服務的根路徑。
  • charset 設置爲 charset utf-8,gbk;,能夠避免中文亂碼問題

一個最簡化的配置以下:

autoindex on;# 顯示目錄
autoindex_exact_size on;# 顯示文件大小
autoindex_localtime on;# 顯示文件時間
server {
    charset      utf-8,gbk; # windows 服務器下設置後,依然亂碼,暫時無解
    listen       9050 default_server;
    listen       [::]:9050 default_server;
    server_name  _;
    root         /share/fs;
}

**七.總結

以上內容只是nginx的冰山一角,作爲一個nginx入門,到這裏就基本完結了。但願對你們有所幫助。
image

相關文章
相關標籤/搜索