寫在前面的話
說起 Nginx,別說運維,就是很多開發人員也很熟悉,畢竟如今已經 2019 年了,Apache 更多的要么成為了歷史,要么成為了歷史殘留。
我們在提及 Nginx 的時候,一直在強調他是一個輕量級,高性能的web,反向代理,郵箱(IMAP/POP3)代理服務器。
和傳統的服務不同,Nginx 不依賴線程來處理請求。下面是它的 logo,沒啥特色:

本文將主要談談 1.16 版本 Nginx 的編譯安裝以及編譯參數的問題!
編譯安裝
我們可以前往 Nginx 的官網下載我們的源碼安裝包:
對於生產應用,穩定放在第一位,所以我們選擇下載 Stable 版本,當然,我們的系統肯定是 CentOS 7.5。

最后是一個老生常談的問題,也是運維人員區別於開發人員的問題。如果我是開發人員,只願意切換到對應的源,一個 yum 命令搞定。但是作為運維人員,我們需要對於服務進行定制化安裝。雖然有些時候讓這個服務變得不那么便於使用。但是一定會變得更為容易管理。我們應當把管理放在首位。
1. 先把常用的一些依賴安裝上:
yum -y install zip unzip gcc gcc-c++ automake autoconf libtool make glibc gd-devel pcre-devel libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel libevent libevent-devel
這些依賴有些並不是 Nginx 所必須,但是屬於那種裝了准沒錯的類型。否則你如果去按照報錯提示一個一個的補充,估計得搞死。
同時,我們需要幾個單獨得安裝包:
我這里提供了百度網盤的下載地址,需要的可以去這里直接下載:
鏈接: https://pan.baidu.com/s/1IpRtZgYFb-Kf71ED3pBEwQ 提取碼: 2k6t
下面是關於這幾個模塊的具體說明和項目地址:
rewrite 需要的 PCRE 庫源碼包:pcre-8.43
gzip 模塊所需的 zlib 庫源碼包:zlib-1.2.11
ssl 功能所需要的 openssl 庫源碼包:openssl-1.1.1c
文件下載界面美化模塊:ngx-fancyindex
https://github.com/aperezdc/ngx-fancyindex
上傳模塊:nginx-upload-module
cache 處理模塊:ngx_cache_purge
fair 負載均衡調度模塊:nginx-upstream-fair
以上提到的都是我們一些常用的插件庫,還是那句話,可能不是必須,但說不定哪天就用到了。
2. 安裝目錄設計和用戶設計:

/data 目錄作為我們整個服務的根目錄。
packages 目錄下 nginx 目錄用於存放我們本次編譯的所有源碼包。
logs 目錄 nginx 目錄用於存放我們的日志,pid 等文件。
services 目錄下 nginx 用於存放我們本次編譯安裝的服務。
backup 目錄下 nginx 目錄用於我們日常配置文件備份,證書等文件備份。
創建這些目錄:
mkdir -p /data/services mkdir -p /data/packages/nginx mkdir -p /data/logs/nginx mkdir -p /data/backup/nginx
本次 nginx 服務的用戶將以 nginx 用戶作為服務運行的用戶:
groupadd nginx
useradd -g nginx nginx
3. 解壓安裝包:
cd /data/packages/nginx
# 解壓安裝包 tar -zxf nginx-1.16.0.tar.gz tar -zxf openssl-1.1.1c.tar.gz tar -zxf pcre-8.43.tar.gz tar -zxf zlib-1.2.11.tar.gz unzip nginx-upload-module-master.zip unzip ngx-fancyindex-master.zip
unzip nginx-upstream-fair-master.zip
unzip ngx_cache_purge-master.zip
由於 upstream_fair 模塊存在 bug,需要修改一下:
cd nginx-upstream-fair-master/ sed -i 's/default_port/no_port/g' ngx_http_upstream_fair_module.c
否則會報錯:ngx_http_upstream_srv_conf_t’沒有名為‘default_port’的成員
4. 編譯安裝包:
cd /data/packages/nginx/nginx-1.16.0 # 編譯檢測 ./configure --prefix=/data/services/nginx \ --user=nginx \ --group=nginx \--with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_flv_module \ --with-http_ssl_module \ --with-http_mp4_module \ --with-stream \ --with-http_realip_module \ --with-http_v2_module \ --with-http_sub_module \ --with-http_image_filter_module \ --with-pcre=/data/packages/nginx/pcre-8.43 \ --with-openssl=/data/packages/nginx/openssl-1.1.1c \ --with-zlib=/data/packages/nginx/zlib-1.2.11 \ --add-module=/data/packages/nginx/nginx-upload-module-master \ --add-module=/data/packages/nginx/nginx-upstream-fair-master \ --add-module=/data/packages/nginx/ngx_cache_purge-master \ --add-module=/data/packages/nginx/ngx-fancyindex-master # 編譯安裝 make && make install
我們可以簡單了解一下部分常用的編譯參數的含義:
cd /data/packages/nginx/nginx-1.16.0
./configure --help
如下:
| 參數 | 含義 |
|---|---|
| --prefix=PATH | 指定安裝路徑,默認 /usr/local 下 |
| --sbin-path=PATH | 指定 sbin 目錄,一般不用指定,在安裝目錄下即可 |
| --conf-path=PATH | 指定配置文件的路徑,也不用修改它,否則不好管理 |
| --error-log-path=PATH 和 --http-log-path=PATH(不建議指定) | 默認日志路徑,這個我們可以修改為我們設計的 |
| --pid-path=PATH 和 --lock-path=PATH(不建議指定) | pid 文件和 lock 文件路徑,我們也可以把它放到 logs 目錄下 |
| --user=USER 和 --group=GROUP | 指定 nginx 允許的用戶名和用戶組,我們這里使用 nginx 用戶 |
| --with-http_ssl_module | HTTPS 的關鍵模塊 |
| --with-http_realip_module | 用於獲取客戶端請求的真實 IP 等作用 |
| --with-http_image_filter_module | 圖片處理,實現圖片放大縮小裁切等功能 |
| --with-http_geoip_module | 用於 IP 訪問控制,例如黑白名單 |
| --with-http_sub_module | 用於字符串替換 |
| --with-http_flv_module 和 --with-http_mp4_module | 流媒體處理模塊 |
| --with-http_gunzip_module 和 --with-http_gzip_static_module | 資源壓縮,靜態資源壓縮 |
| --without-http_auth_basic_module | 禁用用戶認證模塊,該模塊可以用於網頁登錄驗證 |
| --with-http_auth_request_module | 支持第三方認證 |
| --with-http_stub_status_module | nginx 狀態 |
| --with-stream | TCP / UDP 代理模塊 |
| --with-pcre=DIR | 指定 PCRE 目錄 |
| --with-zlib=DIR | 指定 zlib 目錄 |
| --with-openssl=DIR | 指定 openssl 目錄 |
| --with-http_addition_module | 用於給響應的網站追加內容,比如追加 css / js |
| --with-http_random_index_module | 從目錄中隨機挑選索引 |
| --add-module=PATH | 添加其他模塊 |
5. 修改目錄權限並修改配置:
# 編譯安裝 make && make install # 修改權限 chown -R nginx.nginx /data/services/nginx/ chown -R nginx.nginx /data/logs/nginx/ chown -R nginx.nginx /data/backup/nginx/ # 修改配置 cd /data/services/nginx/conf mv nginx.conf nginx.conf_bak
精簡基礎配置如下:nginx.conf
user nginx; worker_processes auto; error_log /data/logs/nginx/error.log info; pid /data/logs/nginx/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; 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 /data/logs/nginx/access.log main; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
6. 檢測配置,啟動服務:
/data/services/nginx/sbin/nginx -t
/data/services/nginx/sbin/nginx
訪問查看:

7. 至此,基礎配置完成!
動態添加模塊
某些時候可能我們會發現少編譯了某個模塊,我們需要后續加上去,這時候就需要動態編譯添加了!
我們這里以添加 echo 模塊為例:
該模塊可以在 nginx 實現 echo 內容,適合用於調試。
1. 查看當前的編譯:
/data/services/nginx/sbin/nginx -V
結果如下:

2. 進入我們之前的解壓包路徑,添加我們需要的參數重新編譯:
解壓模塊:
cd /data/packages/nginx
unzip echo-nginx-module-master.zip
重新檢查:
./configure --prefix=/data/services/nginx \ --user=nginx \ --group=nginx \--with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_secure_link_module \ --with-http_flv_module \ --with-http_ssl_module \ --with-http_mp4_module \ --with-stream \ --with-http_realip_module \ --with-http_v2_module \ --with-http_sub_module \ --with-http_image_filter_module \ --with-pcre=/data/packages/nginx/pcre-8.43 \ --with-openssl=/data/packages/nginx/openssl-1.1.1c \ --with-zlib=/data/packages/nginx/zlib-1.2.11 \ --add-module=/data/packages/nginx/nginx-upload-module-master \ --add-module=/data/packages/nginx/nginx-upstream-fair-master \ --add-module=/data/packages/nginx/ngx_cache_purge-master \ --add-module=/data/packages/nginx/ngx-fancyindex-master \ --add-module=/data/packages/nginx/echo-nginx-module-master
編譯:
make
注意:
只 make 不 make install,否則就完了。
只 make 不 make install,否則就完了。
只 make 不 make install,否則就完了。
重要的事情說三遍!
3. 備份舊版,替換新版:
# 備份 mv /data/services/nginx/sbin/nginx /data/backup/nginx/nginx_$(date +%F) # 更新 cp /data/packages/nginx/nginx-1.16.0/objs/nginx /data/services/nginx/sbin/ # 查看 /data/services/nginx/sbin/nginx -V
結果如下:

一鍵安裝腳本
https://github.com/KU4NG/OP-Shell/tree/master/CentOS-7/nginx
小結
nginx 算是運維必備技能,我們只是講了編譯安裝,如果你是 yum 安裝的話其實很多模塊是不存在的。后續我們會談談配置,調優以及各種常見不常見的需求實現。
