Linux----------nginx基礎

1、nginx簡介

nginx(發音同engine x)是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like協議下發行。前端

nginx由俄羅斯的程序設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler使用。python

第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。mysql

nginx的特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。nginx

nginx的官網:c++

1.1 nginx的特性:

nginx的特性:web

  • 模塊化設計,較好的擴展性
  • 外圍支持好:文檔全,二次開發和模塊較多
  • 支持熱部署:不停機更新配置文件,升級版本,更換日誌文件
  • 低內存消耗:10000個keep-alive鏈接模式下的非活動鏈接,僅須要2.5M內存
  • 支持事件驅動、AIO(AsyncIO,異步IO)、mmap(Memory Map,內存映射)等性能優化
  • 配置通俗易懂
  • 穩定性高:用於反向代理,宕機的機率微乎其微
  • 在高鏈接併發的狀況下,nginx是Apache服務器不錯的替代品,可以支持高達50000個併發鏈接數的響應
  • 使用epoll and kqueue做爲開發模型
  • nginx採用C進行編寫,不論系統資源開銷仍是CPU使用效率都比Perlbal要好不少

1.2 nginx的基本功能

nginx的基本功能:sql

  • 靜態資源的web服務器
  • http協議反向代理服務器
  • pop3/imap4協議反向代理服務器
  • FastCGI(LNMP),uWSGI(python)等協議
  • 模塊化(非DSO),如zip,SSL模塊

1.3 web服務相關的功能:

  • 虛擬主機(server)
  • 支持 keep-alive 和管道鏈接
  • 訪問日誌(支持基於日誌緩衝提升其性能)
  • url rewirte
  • 路徑別名
  • 基於IP及用戶的訪問控制
  • 支持速率限制及併發數限制
  • 從新配置和在線升級而無須中斷客戶的工做進程
  • Memcached 的 GET 接口

1.4 nginx的優勢

nginx的優勢:後端

  • 高併發鏈接:官方測試可以支撐5萬併發鏈接,在實際生產環境中跑到2-3萬併發鏈接數
  • 內存消耗少:在3萬併發鏈接下,開啓的10個nginx進程才消耗150M內存(15M*10=150M)
  • 配置文件很是簡單:風格跟程序同樣通俗易懂
  • 成本低廉:nginx爲開源軟件,能夠無償使用。
  • 支持Rewrite重寫規則:可以根據域名、URL的不一樣,將HTTP請求分到不一樣的後端服務器羣組-
  • 內置的健康檢查功能:若是Nginx Proxy後端的某臺Web服務器宕機了,不會影響前端訪問
  • 節省帶寬:支持GZIP壓縮,能夠添加瀏覽器本地緩存的Header頭
  • 穩定性高:用於反向代理,宕機的機率微乎其微
  • 模塊化設計:模塊能夠動態編譯
  • 外圍支持好:文檔全,二次開發和模塊較多
  • 支持熱部署:能夠不停機重載配置文件
  • 支持事件驅動、AIO(AsyncIO,異步IO)、mmap(Memory Map,內存映射)等性能優化

2、nginx的組成

nginx由內核和模塊組成。其中,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件將客戶端請求映射到一個location block(location是nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每一個指令將會啓動不一樣的模塊去完成相應的工做。瀏覽器

2.1 nginx的程序結構

nginx的程序結構: master/worker結構

一個master進程:負責加載和分析配置文件、管理worker進程、平滑升級
一個或多個worker進程:處理並響應用戶請求
緩存相關的進程:
cache loader:載入緩存對象
cache manager:管理緩存對象

2.2 nginx模塊

nginx由內核和模塊組成。其中,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件將客戶端請求映射到一個location block(location是nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每一個指令將會啓動不一樣的模塊去完成相應的工做。

nginx模塊分類: 模塊分類:

  • 核心模塊:core module(處理類)
  • 標準模塊: (過濾類)
    HTTP 模塊: ngx_http_
    HTTP Core modules 默認功能
    HTTP Optional modules 需編譯時指定
    Mail 模塊 ngx_mail_

    Stream 模塊 ngx_stream_*
  • 第三方模塊(代理類)

3、工做原理

  • nginx工做原理

  • nginx模塊一次常規的HTTP請求和響應的過程

  • web服務請求過程

4、配置文件

Nginx的配置文件nginx.conf位於其安裝目錄的conf目錄下。
nginx.conf由多個塊組成,main(全局設置)、event(事件驅動設置)、server(主機設置)、upstream(負載均衡服務器設置)和 location(URL匹配特定位置的設置)。這五者之間的關係式:server繼承main,location繼承server,upstream既不會繼承其餘設置也不會被繼承。

4.1 Main全局配置

Main 全局配置段常見的配置指令分類:

  • 正常運行必備的配置
  • 優化性能相關的配置
  • 用於調試及定位問題相關的配置
  • 事件驅動相關的配置

4.1.1 正常運行必備的配置

正常運行必備的配置:
幫助文檔:http://nginx.org/en/docs/ngx_core_module.html
一、user
Syntax: user user [group];
Default: user nobody nobody;
Context: main
指定worker進程的運行身份,如組不指定,默認和用戶名同名

二、pid /PATH/TO/PID_FILE
指定存儲nginx主進程PID的文件路徑

三、include file | mask
指明包含進來的其它配置文件片段

四、load_module file
模塊加載配置文件:/usr/share/nginx/modules/*.conf
指明要裝載的動態模塊路徑: /usr/lib64/nginx/modules

4.1.2 性能優化相關的配置

性能優化相關的配置:
一、worker_processes number | auto
worker進程的數量;一般應該爲當前主機的cpu的物理核心數

二、worker_cpu_affinity cpumask ...
worker_cpu_affinity auto [cpumask] 提升緩存命中率
CPU MASK: 00000001:0號CPU
00000010:1號CPU
10000000:8號CPU
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;

三、worker_priority number
指定worker進程的nice值,設定worker進程優先級:[-20,20]

四、worker_rlimit_nofile number
worker進程所可以打開的文件數量上限,如65535

4.2 事件驅動相關的配置

events {
         ...
}

一、worker_connections number
每一個worker進程所可以打開的最大併發鏈接數數量,如10240
總最大併發數:worker_processes * worker_connections

二、use method
指明併發鏈接請求的處理方法 ,默認自動選擇最優方法
use epoll;

三、accept_mutex on | off 互斥
處理新的鏈接請求的方法;on指由各個worker輪流處理新請求,Off指每一個新請求的到達都會通知(喚醒)全部的worker進程,但只有一個進程可得到鏈接,形成「驚羣」,影響性能

  • 調試和定位問題:
    一、daemon on|off 是否以守護進程方式運行nignx,默認是守護進程方式
    二、master_process on|off 是否以master/worker模型運行nginx;默認爲on,off 將不啓動worker
    三、error_log file [level] 錯誤日誌文件及其級別;出於調試須要,可設定爲debug;但debug僅在編譯時使用了「--with-debug」選項時纔有效
    方式:file /path/logfile;
    stderr:發送到標準錯誤
    syslog:server-address[,parameter=values]:發送到syslog
    memory:size 內存
    level:debug|info|notice|warn|error|crit|alter|emerg

4.3 http協議的相關配置

http協議的相關配置:

http {
          ... ...
         server {
                       ...
                      server_name
                      root
                     location [OPERATOR] /uri/ {
                                    ...
                     }
        }
        server {
                        ...
}

此配置請看隨筆----nginx-http協議具體配置

4.4 stream服務器相關配置段

nginx的其它的二次發行版:
Tengine:由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了不少高級功能和特性。Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等獲得了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。從2011年12月開始,Tengine成爲一個開源項目,官網 http://tengine.taobao.org/
OpenResty:基於 Nginx 與 Lua 語言的高性能 Web平臺

nginx_stream_core_module模塊
模擬反代基於tcp或udp的服務鏈接,即工做於傳輸層的反代或調度器

  • 一、stream { ... }
    定義stream相關的服務;Context:main
stream {
       upstream mysqlsrvs {
           server 192.168.22.2:3306;
           server 192.168.22.3:3306;
           least_conn;
       }
      server {
           listen 10.1.0.6:3306;
            proxy_pass mysqlsrvs;
       }
}
  • 二、listen
    listen address:port [ssl] [udp] [proxy_protocol][backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

  • 可實現代理基於TCP,UDP (1.9.13), UNIX-domain sockets的數據流
    1 proxy_pass address; 指定後端服務器地址
    2 proxy_timeout timeout; 無數據傳輸時,保持鏈接狀態的超時時長,默認爲10m
    3 proxy_connect_timeout time; 設置nginx與被代理的服務器嘗試創建鏈接的超時時長,默認爲60s

  • 示例:
stream {
            upstream mysqlsrvs {
                       server 192.168.0.10:3306;
                       server 192.168.0.11:3306;
                       hash $remote_addr consistent;
            }
            server {
                      listen 172.16.100.100:3306;
                      proxy_pass mysqlsrvs;
                      proxy_timeout 60s;
                      proxy_connect_timeout 10s;
            }
}

4.5 常須要調整的參數

  • worker_processes //啓動n個worker進程,這裏的n爲了不上下文切換,一般設置爲cpu總核心數-1或等於總核心數
  • worker_connections //進程可以接受的最大鏈接數(最大32000)
  • worker_cpu_affinity 01 10 //表示開啓兩個進程,第一個進程對應着第一個CPU內核,第二個進程對應着第二個CPU內核
  • worker_priority 0 //進程的靜態優先級,範圍在-20~19,-20爲最高優先級

5、編譯安裝nginx

//建立系統用戶nginx
[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx

//安裝依賴環境
[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
[root@localhost ~]# yum -y groups mark install 'Development Tools'

//建立日誌存放目錄
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx

//下載nginx
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget http://nginx.org/download/nginx-1.12.0.tar.gz

//編譯安裝
[root@localhost src]# ls
debug  kernels  nginx-1.12.0.tar.gz
[root@localhost src]# tar xf nginx-1.12.0.tar.gz
[root@localhost src]# cd nginx-1.12.0
[root@localhost nginx-1.12.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log

[root@localhost nginx-1.12.0]# make -j 2 && make install

//設置環境變量
[root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost ~]# . /etc/profile.d/nginx.sh

//啓動nginx 
[root@localhost ~]# nginx   -t           //j檢查配置文件是否有問題
[root@localhost ~]# nginx                //啓動nginx
[root@localhost ~]# nginx -s stop    //中止nginx
相關文章
相關標籤/搜索