初識Nginx

初識Nginx

 

這裏寫圖片描述

 

前言

  Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,也是一個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,有的還進行了二次開發來滿足自己的需求,比如阿里、騰訊等。

  在17年的十月份nginx的主機的市場份額首次超過了Microsoft,上升到第二位。而在前一百萬的站點中的市場份額nginx早已遙遙領先其他主機,與Apache的差距不斷縮小。

這裏寫圖片描述

這裏寫圖片描述

參考數據來自:https://news.netcraft.com/archives/2017/10/26/october-2017-web-server-survey-13.html

 

Nginx 介紹

 

Nginx 特性

 Nginx在設計上採用了模塊化的結構,這是它擁有較好的擴展性。另外內存消耗方面Nginx的表現也非常好,10000個keep-alive連接模式下的非活動連接,僅需要2.5M內存。而且Nginx支持熱部署,可以不停機更新配置文件,升級版本,更換日誌文件。Nginx的高可靠性也是大多數互聯網企業選擇它的重要原因。

 

Nginx 架構

這裏寫圖片描述

                    Nginx架構圖

Nginx的程序架構:

master/worker結構

  • 一個master進程:

      負載加載和分析配置文件、管理worker進程、平滑升級

  • 一個或多個worker進程:

      處理並響應用戶請求

  • 緩存相關的進程:

     cache loader:載入緩存對象
     cache manager:管理緩存對象

 
 

Nginx 安裝

yum安裝

yum源地址

  • 官網yum源

  http://nginx.org/packages/centos/6/x86_64/

  • 阿里雲epel源

  https://mirrors.aliyun.com/epel/6/x86_64/

配置好yum源地址,就可以安裝nginx了

[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/6/x86_64/
gpgcheck=0
enabled=1

安裝

yum -y install nginx

 

編譯安裝

yum -y groupinstall "developments tools" 

yum -y install pcre-devel openssl-devel
  • 創建賬號
useradd  -r nginx -s /sbin/nologin
  • 更改版本名
tar -xf nginx-1.12.2.tar.gz

cd nginx-1.12.2

vim src/http/ngx_http_header_filter_module.c 

static u_char ngx_http_server_string[] = "Server: nginx" CRLF;

#Server: nginx 可以通過修改後面的字段,修改版本名

注意:這裏修改的版本名,需要在主配置文件中加入server_tokens off; ,這樣纔會顯示此版本名,並且只顯示版本名,不能顯示版本號。

如果要同時顯示版本名和版本號的更改,可以進行以下設置

vim src/core/nginx.h 

#define nginx_version      1020001
#define NGINX_VERSION      "2.1"                     #此處更改的是版本號
#define NGINX_VER          "Jenginx/" NGINX_VERSION  #此處更改版本名
  • 創建Makefile文件
./configure \
--prefix=/usr/share/nginx \  #根目錄
--sbin-path=/usr/sbin/nginx \ #主程序文件路徑
--modules-path=/usr/lib64/nginx/modules \ #模塊文件路徑
--conf-path=/etc/nginx/nginx.conf \ #配置文件路徑
--error-log-path=/var/log/nginx/error.log \ #錯誤日誌文件路徑
--http-log-path=/var/log/nginx/access.log \ #http日誌文件路徑
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \ #客戶端主體文件臨時存放路徑
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \ #http反向代理服務器響應報文臨時文件存放路徑
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \ #FastCGI反向代理服務器響應報文臨時文件存放路徑
--pid-path=/run/nginx.pid \ #pid文件路徑
--lock-path=/run/lock/subsys/nginx \ #鎖文件路徑
--user=nginx \ #wroker進程發起者用戶名
--group=nginx \ #wroker進程發起者組名
--with-file-aio \ #文件異步存儲模塊
--with-http_gunzip_module \ #gunzip壓縮模塊
--with-http_gzip_static_module \ #gzip壓縮模塊
--with-http_stub_status_module \ #服務器信息顯示模塊
--with-pcre \ #支持正則匹配模塊
--with-stream=dynamic \ 
--with-stream_ssl_module \
--with-debug 
  • 編譯安裝
make && make install

 

nginx 目錄結構

ls /usr/share/nginx/

html是測試頁目錄

ls /usr/sbin/nginx

nginx 是主程序,只有一個程序文件

ls /usr/share/nginx/html

index.html 測試網頁

 

nginx 命令

  • 啓動 nginx 服務
nginx
  • 停止 nginx 服務
nginx -s stop
  • 重新加載配置文件
nginx -s reload
  • 在命令行中指明全局指令
nginx -g directives
  • 檢查配置文件語法
nginx -t
  • 查看幫助選項
nginx -h
  • 指定配置文件
nginx -c PATH:file  (默認:/etc/nginx/nginx.conf)

nginx 配置

配置文件的組成部分:

  • 主配置文件:
/etc/nginx/nginx.conf
  • 子配置文件:
/etc/nginx/conf.d/*.conf  #子配置文件可以自定義
  • fastcgi, uwsgi, scgi等協議相關的配置文件

  • mime.types:支持的mime類型
     

主配置文件的配置指令:

directive value [value2 ...]

注意:
(1) 指令必須以分號結尾
(2) 支持使用配置變量
  內建變量:由Nginx模塊引入,可直接引用
  自定義變量:由用戶使用set命令定義set variable_name value;
  引用變量: $variable_name

 

nginx 配置文件

主配置文件結構

main block:             #主配置段,即全局配置段,對http,mail都有效
        event {
        ...
        }                #事件驅動相關的配置
http {
    ...
 }                       #http/https 協議相關配置段
mail {
    ...
 }                       #mail 協議相關配置段
stream {
    ...
 }                       #stream 服務器相關配置段

 

http相關配置

http {
            ...
                        ...             #各server的公共配置
            server {                    #每個server用於定義一個虛擬主機
                    ...
                    }
            server {
                    ...
                    server_name         #虛擬主機名
                    root                #主目錄
                    alias               #路徑別名
                    location [OPERATOR] URL { 
                                指定URL的特性
                                ...
                    if CONDITION {
                                ...
                              }
                     }
              }
    }

 

  • Main 全局配置段常見的配置指令分類
    1. 正常運行必備的配置
    2. 優化性能相關的配置
    3. 用於調試及定位問題相關的配置
    4. 事件驅動相關的配置

 

 

正常運行必備的配

  • 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

 

 

性能優化相關的配置

1、worker進程的數量;通常應該爲當前主機的cpu的物理核心數

worker_processes number | auto

2、worker進程和CPU綁定,提高緩存命中率

worker_cpu_affinity cpumask ...
worker_cpu_affinity auto [cpumask] 

例如:

# 4顆CPU,啓動4個worker進程,將每個進程分別與CPU0, CPU1, CPU2, CPU3綁定
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

# 4顆CPU,啓動2個worker進程,第一個進程綁定到CPU0/CPU2上,第二個進程綁定到CPU1/CPU3上
worker_process 2;
worker_cpu_affinity 0101 1010;

#自動綁定
worker_process auto;
worker_cpu_affinity auto;

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

worker_priority number

4、worker進程所能夠打開的文件數量上限,如65535

worker_rlimit_nofile number

 

事件驅動相關的配置:

events {
...
}

1、每個worker進程所能夠打開的最大併發連接數數量,如:10240總最大併發數: worker_processes * worker_connections

worker_connections number

2、指明併發連接請求的處理方法,默認自動選擇最優方法

use method

# example
use epoll;

3、處理新的連接請求的方法; on指由各個worker輪流處理新請求, Off指每個新請求的到達都會通知(喚醒)所有的worker進程,但只有一個進程可獲得連接,造成“驚羣”,影響性能,默認on

accept_mutex on | off     

 

調試和定位問題

1、是否以守護進程方式運行nignx,默認是守護進程方式

daemon on|off

2、是否以master/worker模型運行nginx;默認爲on,off 將不啓動worker

master_process on|off

3、錯誤日誌文件及其級別;出於調試需要, 可設定爲debug;但debug僅在編譯時使用了“–with-debug”選項時纔有效

error_log file [level]
#設置log文件 file /path/logfile;
stderr:                                             #發送到標準錯誤
syslog:server-address[,parameter=values]:           #發送到syslog
memory:size                                         #內存
level:debug|info|notice|warn|error|crit|alter|emerg

 

http協議的相關配置

http {

server {

server_name
root
location [OPERATOR] /uri/ {

}
}
server {

}
}

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