初識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 全局配置段常見的配置指令分類
- 正常運行必備的配置
- 優化性能相關的配置
- 用於調試及定位問題相關的配置
- 事件驅動相關的配置
正常運行必備的配
- 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 {
…
}
}