Nginx 介紹
Nginx 是一個高性能的 Web 服務器,從 2001 年發展至今,由于 Nginx 對硬體和作業系統內核特性的深度挖掘,使得在保持高并發的同時還能夠保持高吞吐量,Nginx 還采用了模塊設計,有大量的第三方模塊可以擴展 Nginx 的功能,因此 Nginx 的場景非常豐富,同時 Nginx 采用的是 BSD 許可證,賦予了 Nginx 最大的靈活性,簡單來說,Nginx 具有以下幾個優點:
- 高并發,高性能
- 可擴展性好
- 高可靠,一年之中停機時間可能只有幾秒
- 熱部署,可以不重啟升級
- 靈活性高,采用BSD 許可證
BSD開源協議是一個給予使用者者很大自由的協議,基本上使用者可以“為所欲為”,可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟體再發布,
截止 2019 年 9 月份,Nginx 的市場份額已經達到了 33%,且還在持續增長,穩居市場頭把交椅,

背景
Nginx 出現的背景是由于互聯網的快速普及導致資料量的快速增長,同時催生出了海量的連接,傳統的 Apache 等服務器采用的是單行程模型,這意味著,每處理一個請求就會創建一個行程,這不但存在行程創建的開銷,而且行程之間相互切換產生的背景關系開銷也非常耗費 CPU 資源,導致這種傳統的服務器在面對成千上萬的并發連接時,性能非常低下,而這是快速發展的互聯網所不能夠忍受的,
在這種背景下,Nginx 采用的是行程池和 epoll 處理模型,這二者加起來使得 Nginx 的性能非常優異,一臺 32 核的機器上可以支撐數千萬的并發連接,
Nginx 有一個 master 行程和若干個 worker 行程,master 行程是用來管理 worker 行程的,worker 行程負責處理具體的請求,worker 行程是 master 行程的子行程,
Nginx 的版本
介紹完 Nginx 的背景,我們就該說說 Nginx 的版本了,目前 Nginx 有三個主要的產品:
- 官方 Nginx,包含開源版(nginx.org)和商業版(nginx.com)
- 阿里巴巴的 Tengine,Tengine 是由淘寶網發起的 Web 服務器專案,目前已經開源
- OpenResty,OpenResty 通過 Lua 對 Nginx 進行擴展,使得擴展 Nginx 模塊變得例外輕松
針對我們日常學習來說,選擇官方開源版的 Nginx 以及 OpenResty 就可以了,
編譯 Nginx 和 OpenResty
在 Linux 上,當然可以使用 yum、apt-get 等軟體包管理工具來下載 Nginx,但是 Nginx 的很多模塊并不是默認開啟的,第三方模塊很多也并不包含,所以,如果想要開啟內置的模塊或編譯第三方模塊,還是需要編譯 Nginx,
下載 Nginx 源代碼
在 http://nginx.org/en/download.html 里面可以直接下載 Nginx 源代碼,包含以下目錄:
nginx-1.17.8
├── CHANGES # 每個版本提供的特性和 bugfix
├── CHANGES.ru # 俄羅斯版本的 CHANGES 檔案
├── LICENSE
├── Makefile
├── README
├── auto # 自動檢測系統環境以及編譯相關的腳本,輔助 config 腳本執行的時候去判定 nginx 支持哪些模塊,當前作業系統有什么樣的特性可以供給 nginx 使用
├── conf # 示例檔案,方便運維配置,會把 conf 示例檔案拷貝到安裝目錄
├── configure # 命令腳本,用來生成中間檔案,執行編譯前的一個必備動作
├── contrib # 提供了兩個 pl 腳本和 vim 工具
├── html # 一個 500 錯誤的默認頁面,另一個是默認的 index 頁面
├── man # nginx 對 Linux 的幫助檔案,man ./nginx.8
└── src # nginx 源代碼
配置 Vim
如果 Vim 沒有開啟語法高亮的話,最好開啟一下
cp -r contrib/vim/* ~/.vim
# mac 下需要在家目錄下新建 .vimrc 檔案并配置
syntax on
編譯 Nginx
./configure --help # --help 命令可以查看配置腳本支持哪些引數
第一類配置引數
--prefix=PATH set installation prefix # 指定這個路徑就可以了,其他檔案會在 prefix 目錄下建立相應的檔案夾
--sbin-path=PATH set nginx binary pathname
--modules-path=PATH set modules path
--conf-path=PATH set nginx.conf pathname
--error-log-path=PATH set error log pathname
--pid-path=PATH set nginx.pid pathname
--lock-path=PATH set nginx.lock pathname
第二類配置引數
可以配置使用或不使用哪些模塊,前綴通常是 with 和 with out,需要加 with 引數的通常是不會被 Nginx 默認編譯的,without 則是會移出編譯,
--with-http_ssl_module enable ngx_http_ssl_module
--with-http_v2_module enable ngx_http_v2_module
--with-http_realip_module enable ngx_http_realip_module
...
--without-http_charset_module disable ngx_http_charset_module
--without-http_gzip_module disable ngx_http_gzip_module
--without-http_ssi_module disable ngx_http_ssi_module
...
開始編譯
# 1. 使用默認引數,指定編譯安裝目錄
./configure --prefix=/Users/mtdp/myproject/nginx/nginx
# 編譯完成后生成 objs 檔案夾中間檔案
? objs ll
total 176
-rw-r--r-- 1 mtdp staff 40K 3 3 07:23 Makefile
-rw-r--r-- 1 mtdp staff 25K 3 3 07:23 autoconf.err
-rw-r--r-- 1 mtdp staff 5.4K 3 3 07:23 ngx_auto_config.h
-rw-r--r-- 1 mtdp staff 531B 3 3 07:23 ngx_auto_headers.h
-rw-r--r-- 1 mtdp staff 5.7K 3 3 07:23 ngx_modules.c # ngx_modules.c 決定了接下來的編譯會生成哪些模塊
drwxr-xr-x 9 mtdp staff 288B 3 3 07:23 src
2. # 編譯
make # 生成了大量的中間檔案,如果是版本升級,就不能直接 makeinstall,需要將 obj 拷貝到安裝目錄,如果生成了動態模塊,編譯后也會放在 objs 目錄下
3. # 安裝
make install
? nginx ll # 安裝完成后生成以下檔案夾
total 0
drwxr-xr-x 17 mtdp staff 544B 3 3 07:29 conf # 從 Nginx 原始碼目錄拷貝的
drwxr-xr-x@ 4 mtdp staff 128B 3 3 07:29 html # 從 Nginx 原始碼目錄拷貝的
drwxr-xr-x 2 mtdp staff 64B 3 3 07:29 logs # 日志檔案目錄,包括 access log 和 error log
drwxr-xr-x 3 mtdp staff 96B 3 3 07:29 sbin # Nginx 二進制檔案目錄
編譯 OpenResty
OpenResty 的編譯安裝步驟與 Nginx 基本一致
在 https://openresty.org/en/download.html 中下載 OpenResty 的源代碼,然后按照 Nginx 的編譯步驟執行即可,
Nginx 組態檔
配置規則
events {
worker_connections 1024;
}
http {
#incloud 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 logs/geek.access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
gzip_min_length 1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png multipart/form-data;
server {
listen 8080;
server_name 127.0.0.1;
#charset koi8-r;
access_log logs/geek.access.log main;
location /lua {
default_type text/html;
content_by_lua '
ngx.say("User-Agent: ", ngx.req.get_headers()["User-Agent"])
';
}
}
#error_page 404 /404.html;
}
如上所示,是一個非典型的 Nginx 組態檔,Nginx 的組態檔語法遵循以下規則:
- 組態檔由指令與指令塊構成
- 每條指令以 ; 結尾,指令與指令的引數之間以空格符號分割
- 指令塊以 {} 將多條指令組織在一起
events { # 指令塊
worker_connections 1024; # 指令
}
- include 陳述句允許組合多個組態檔,以提升可維護性
- 使用 # 添加注釋
- 使用 $ 符號添加變數
- 部分指令的引數支持正則運算式
配置引數
時間單位
- ms:毫秒
- s:秒
- m:分鐘
- h:小時
- d:天
- M:月 = 30 天
- y:年 = 365 天
空間單位
- bytes
- k/K:kilobytes
- m/M:megabytes
- g/G:gigabytes
HTTP 配置的指令塊
- http:表示由 http 模塊來處理請求
- upstream:表示上游服務器地址
- server:表示站點地址
- location:表示 URL
這些指令塊在接下來都會遇到,
Nginx 命令列
在剛剛編譯完成的 Nginx 目錄下,有一個 sbin 目錄,就是用來存放 Nginx 的二進制檔案的
? sbin ll
total 1712
-rwxr-xr-x 1 mtdp staff 854K 3 3 07:29 nginx
Nginx 啟動時,有一系列的命令列引數可以指定,下面分別介紹一下,
./nginx
-h/-? # 打開幫助
-c # 使用指定的組態檔,而不是默認的 conf 檔案夾下的組態檔
-g # 指定配置命令,覆寫掉組態檔中的指令
-p # 指定運行目錄
-s # 發送信號 stop 立刻停止服務;quit 優雅的停止服務;reload 多載組態檔;reopen 重新開始記錄日志檔案
-t/-T # 測驗組態檔是否有語法錯誤
-v/-V # 列印 nginx 的版本資訊、編譯資訊等
熱部署
當組態檔發生變更時,需要多載組態檔:
nginx -s reload
但想要更換 nginx 版本時,就需要采用熱部署的方式:
- 查看現有 master 行程的 pid,可以看出來,worker 行程是 master 行程的子行程

- 拷貝新的二進制檔案到安裝目錄,然后 kill 發送信號給現有的 master 行程
# master 行程 pid 為 83308
kill -USR2 61333
查看 Nginx 行程,可以發現,新的 master 行程也是基于老的 master 行程 fork 出來的

- 關閉老的 master 行程下的 worker 行程,這個時候會發現,基于 61333 這個 master 的 worker 行程已經退出了
# 優雅的關閉老的 master 所有的 worker 行程,執行后,老的 master 并不會退出但是 worker 已經沒了,防止新行程有問題,還可以通過 reload 來回滾
kill -WINCH 61333

- 如果沒有問題,那么就執行退出老的 master 行程,這個時候再查看,老的 master 行程已經不存在了
# 優雅的退出 master
kill -quit 61333

日志切割
一條命令即可實作日志切割:
nginx -s reopen # 會重新生成日志檔案
關注公眾號領取二十套技術圖譜

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/122579.html
標籤:Linux
上一篇:搭建屬于自己的服務器
下一篇:linux下查看系統版本
