nginx簡介 nginx(發音同engine x)是一款輕量級的Web伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,併在一個BSD like協議下發行。 nginx由俄羅斯的程式設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler使用。 第一個公 ...
nginx簡介
nginx(發音同engine x)是一款輕量級的Web伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,併在一個BSD-like協議下發行。
nginx由俄羅斯的程式設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler使用。
第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。
nginx的特點是占有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
nginx的特性與優點
nginx的特性
nginx是一個很牛的高性能Web和反向代理伺服器,它具有很多非常優越的特性:
- 在高連接併發的情況下,nginx是Apache伺服器不錯的替代品,能夠支持高達50000個併發連接數的響應
- 使用epoll and kqueue作為開發模型
- nginx作為負載均衡伺服器:nginx既可在內部直接支持和PHP程式對外進行服務,也可支持作為HTTP代理伺服器對外進行服務
- nginx採用C進行編寫,不論系統資源開銷還是CPU使用效率都比Perlbal要好很多
nginx的優點
- 高併發連接:官方測試能夠支撐5萬併發連接,在實際生產環境中跑到2-3萬併發連接數
- 記憶體消耗少:在3萬併發連接下,開啟的10個nginx進程才消耗150M記憶體(15M*10=150M)
- 配置文件非常簡單:風格跟程式一樣通俗易懂
- 成本低廉:nginx為開源軟體,可以免費使用。而購買F5 BIG-IP、NetScaler等硬體負載均衡交換機則需要十多萬至幾十萬人民幣
- 支持Rewrite重寫規則:能夠根據功能變數名稱、URL的不同,將HTTP請求分到不同的後端伺服器群組
- 內置的健康檢查功能:如果Nginx Proxy後端的某台Web伺服器宕機了,不會影響前端訪問
- 節省帶寬:支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭
- 穩定性高:用於反向代理,宕機的概率微乎其微
- 模塊化設計:模塊可以動態編譯
- 外圍支持好:文檔全,二次開發和模塊較多
- 支持熱部署:可以不停機重載配置文件
- 支持事件驅動、AIO(AsyncIO,非同步IO)、mmap(Memory Map,記憶體映射)等性能優化
nginx的功能及應用類別
nginx的基本功能
- 靜態資源的web伺服器,能緩存打開的文件描述符
- http、smtp、pop3協議的反向代理伺服器
- 緩存加速、負載均衡
- 支持FastCGI(fpm,LNMP),uWSGI(Python)等
- 模塊化(非DSO機制),過濾器zip、SSI及圖像的大小調整
- 支持SSL
nginx的擴展功能
- 基於名稱和IP的虛擬主機
- 支持keepalive
- 支持平滑升級
- 定製訪問日誌、支持使用日誌緩衝區提高日誌存儲性能
- 支持URL重寫
- 支持路徑別名
- 支持基於IP及用戶的訪問控制
- 支持速率限制,支持併發數限制
nginx的應用類別
- 使用nginx結合FastCGI運行PHP、JSP、Perl等程式
- 使用nginx作反向代理、負載均衡、規則過濾
- 使用nginx運行靜態HTML網頁、圖片
- nginx與其他新技術的結合應用
nginx的模塊與工作原理
nginx由內核和模塊組成。其中,內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個location block(location是nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每個指令將會啟動不同的模塊去完成相應的工作。
nginx的模塊分類
nginx的模塊從結構上分為核心模塊、基礎模塊和第三方模塊
- HTTP模塊、EVENT模塊和MAIL模塊等屬於核心模塊
- HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊屬於基本模塊
- HTTP Upstream模塊、Request Hash模塊、Notice模塊和HTTP Access Key模塊屬於第三方模塊
用戶根據自己的需要開發的模塊都屬於第三方模塊。正是有瞭如此多模塊的支撐,nginx的功能才會如此強大
nginx模塊從功能上分為三類,分別是:
- Handlers(處理器模塊)。此類模塊直接處理請求,併進行輸出內容和修改headers信息等操作。handlers處理器模塊一般只能有一個
- Filters(過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由nginx輸出
- Proxies(代理器模塊)。就是nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務比如fastcgi等操作交互,實現服務代理和負載均衡等功能
nginx模塊分為:核心模塊、事件模塊、標準Http模塊、可選Http模塊、郵件模塊、第三方模塊和補丁等
- nginx基本模塊:所謂基本模塊,指的是nginx預設的功能模塊,它們提供的指令,允許你使用定義nginx基本功能的變數,在編譯時不能被禁用,包括:
- 核心模塊:基本功能和指令,如進程管理和安全。常見的核心模塊指令,大部分是放置在配置文件的頂部
- 事件模塊:在Nginx內配置網路使用的能力。常見的events(事件)模塊指令,大部分是放置在配置文件的頂部
- 配置模塊:提供包含機制
具體的指令,請參考nginx的官方文檔
nginx的工作原理
nginx的模塊直接被編譯進nginx,因此屬於靜態編譯方式。
啟動nginx後,nginx的模塊被自動載入,與Apache不一樣,首先將模塊編譯為一個so文件,然後在配置文件中指定是否進行載入。
在解析配置文件時,nginx的每個模塊都有可能去處理某個請求,但是同一個處理請求只能由一個模塊來完成。
nginx的進程架構:
啟動nginx時,會啟動一個Master進程,這個進程不處理任何客戶端的請求,主要用來產生worker線程,一個worker線程用來處理n個request。
nginx的配置文件詳解
主配置文件:/usr/local/nginx/conf/nginx.conf
- 預設啟動nginx時,使用的配置文件是:安裝路徑/conf/nginx.conf文件
- 可以在啟動nginx時通過-c選項來指定要讀取的配置文件
nginx常見的配置文件及其作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME類型關聯的擴展文件 |
fastcgi.conf | 與fastcgi相關的配置 |
proxy.conf | 與proxy相關的配置 |
sites.conf | 配置nginx提供的網站,包括虛擬主機 |
6.1 nginx.conf配置詳解
nginx.conf的內容分為以下幾段:
- main配置段:全局配置段。其中main配置段中可能包含event配置段
- event {}:定義event模型工作特性
- http {}:定義http協議相關的配置
配置指令:要以分號結尾,語法格式如下:
derective value1 [value2 ...]
支持使用變數:
- 內置變數:模塊會提供內建變數定義
- 自定義變數:set var_name value
用於調試、定位問題的配置參數
daemon {on|off}; #是否以守護進程方式運行nginx,調試時應設置為off
master_process {on|off}; #是否以master/worker模型來運行nginx,調試時可以設置為off
error_log 位置 級別; #配置錯誤日誌
error_log里的位置和級別能有以下可選項:
- 位置
- file
- stderr
- syslog:server=address[,parameter=value]
- memory:size
- 級別
- debug(若要使用debug級別,需要在編譯nginx時使用--with-debug選項)
- info
- notice
- warn
- error
- crit
- alert
- emerg
正常運行必備的配置參數
user USERNAME [GROUPNAME]; #指定運行worker進程的用戶和組
pid /path/to/pid_file; #指定nginx守護進程的pid文件
worker_rlimit_nofile number; #設置所有worker進程最大可以打開的文件數,預設為1024
worker_rlimit_core size; #指明所有worker進程所能夠使用的總體的最大核心文件大小,保持預設即可
優化性能的配置參數
worker_processes n; #啟動n個worker進程,這裡的n為了避免上下文切換,通常設置為cpu總核心數-1或等於總核心數
worker_cpu_affinity cpumask ...; #將進程綁定到某cpu中,避免頻繁刷新緩存
#cpumask:使用8位二進位表示cpu核心,如:
0000 0001 #第一顆cpu核心
0000 0010 #第二顆cpu核心
0000 0100 #第三顆cpu核心
0000 1000 #第四顆cpu核心
0001 0000 #第五顆cpu核心
0010 0000 #第六顆cpu核心
0100 0000 #第七顆cpu核心
1000 0000 #第八顆cpu核心
timer_resolution interval; #計時器解析度。降低此值,可減少gettimeofday()系統調用的次數
worker_priority number; #指明worker進程的nice值
事件相關的配置:event{}段中的配置參數
accept_mutex {off|on}; #master調度用戶請求至各worker進程時使用的負載均衡鎖;on表示能讓多個worker輪流地、序列化地去響應新請求
lock_file file; #accept_mutex用到的互斥鎖鎖文件路徑
use [epoll | rtsig | select | poll]; #指明使用的事件模型,建議讓nginx自行選擇
worker_connections #; #每個進程能夠接受的最大連接數
網路連接相關的配置參數
keepalive_timeout number; #長連接的超時時長,預設為75s
keepalive_requests number; #在一個長連接上所能夠允許請求的最大資源數
keepalive_disable [msie6|safari|none]; #為指定類型的UserAgeng禁用長連接
tcp_nodelay on|off; #是否對長連接使用TCP_NODELAY選項,為了提升用戶體驗,通常設為on
client_header_timeout number; #讀取http請求報文首部的超時時長
client_body_timeout number; #讀取http請求報文body部分的超時時長
send_timeout number; #發送響應報文的超時時長
fastcgi的相關配置參數
LNMP:php要啟用fpm模型
配置示例如下:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; #定義反向代理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
常需要進行調整的參數
worker_processes
worker_connections
worker_cpu_affinity
worker_priority
nginx作為web伺服器時使用的配置:http{}段的配置參數
http{...}:配置http相關,由ngx_http_core_module模塊引入。nginx的HTTP配置主要包括四個區塊,結構如下:
http { #協議級別
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzipon;
upstream { #負載均衡配置
...
}
server { #伺服器級別,每個server類似於httpd中的一個<VirtualHost>
listen80;
server_name localhost;
location / { #請求級別,類似於httpd中的<Location>,用於定義URL與本地文件系統的映射關係
root html;
index index.html index.htm;
}
}
}
http{}段配置指令:
server {}:定義一個虛擬主機,示例如下:
server {
listen 80;
server_name www.idfsoft.com;
root "/vhosts/web";
}
listen:指定監聽的地址和埠
listen address[:port];
listen port;
server_name NAME [...]; 後面可跟多個主機,名稱可使用正則表達式或通配符
當有多個server時,匹配順序如下:
- 先做精確匹配檢查
- 左側通配符匹配檢查,如*.idfsoft.com
- 右側通配符匹配檢查,如mail.*
- 正則表達式匹配檢查,如~ ^.*.idfsoft.com$
- default_server
root path;
設置資源路徑映射,用於指明請求的URL所對應的資源所在的文件系統上的起始路徑alias path;
用於location配置段,定義路徑別名index file;
預設主頁面
index index.php index.html;
error_page code [...] [=code] URI | @name
根據http響應狀態碼來指明特用的錯誤頁面,例如 error_page 404 /404_customed.html[=code]:
以指定的響應碼進行響應,而不是預設的原來的響應,預設表示以新資源的響應碼為其響應碼,例如 error_page 404 =200 /404_customed.htmllog_format
定義日誌格式
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/access.log main;
#註意:此處可用變數為nginx各模塊內建變數
location區段,通過指定模式來與客戶端請求的URI相匹配
- 功能:允許根據用戶請求的URI來匹配定義的各location,匹配到時,此請求將被相應的location配置塊中的配置所處理,例如做訪問控制等功能
#語法:location [ 修飾符 ] pattern {......}
常用修飾符說明:
修飾符 | 功能 |
---|---|
= | 精確匹配 |
~ | 正則表達式模式匹配,區分大小寫 |
~* | 正則表達式模式匹配,不區分大小寫 |
^~ | 首碼匹配,類似於無修飾符的行為,也是以指定模塊開始,不同的是,如果模式匹配,那麼就停止搜索其他模式了,不支持正則表達式 |
@ | 定義命名location區段,這些區段客戶端不能訪問,只可以由內部產生的請求來訪問,如try_files或error_page等 |
沒有修飾符表示必須以指定模式開始,如:
server {
server_name www.idfsoft.com;
location /abc {
......
}
}
那麼如下內容就可正確匹配:
- http://www.idfsoft.com/abc
- http://www.idfsoft.com/abc?p1=11&p2=22
- http://www.idfsoft.com/abc/
=:表示必須與指定的模式精確匹配,如:
server {
server_name www.idfsoft.com;
location = /abc {
......
}
}
那麼如下內容就可正確匹配:
- http://www.idfsoft.com/abc
- http://www.idfsoft.com/abc?p1=11&p2=22
如下內容則無法匹配:
- http://www.idfsoft.com/abc/
- http://www.idfsoft.com/abc/abcde
~:表示指定的正則表達式要區分大小寫,如:
server {
server_name www.idfsoft.com;
location ~ ^/abc$ {
......
}
}
那麼如下內容就可正確匹配:
- http://www.idfsoft.com/abc
- http://www.idfsoft.com/abc?p1=11&p2=22
如下內容則無法匹配:
- http://www.idfsoft.com/abc/
- http://www.idfsoft.com/ABC
- http://www.idfsoft.com/abcde
**~*:表示指定的正則表達式不區分大小寫,如:**
server {
server_name www.idfsoft.com;
location ~* ^/abc$ {
......
}
}
那麼如下內容就可正確匹配:
- http://www.idfsoft.com/abc
- http://www.idfsoft.com/abc?p1=11&p2=22
- http://www.idfsoft.com/ABC
如下內容則無法匹配:
- http://www.idfsoft.com/abc/
- http://www.idfsoft.com/abcde
~:類似於無修飾符的行為,也是以指定模式開始,不同的是,如果模式匹配,則停止搜索其他模式
查找順序和優先順序:由高到底依次為
- 帶有=的精確匹配優先
- 正則表達式按照他們在配置文件中定義的順序
- 帶有^~修飾符的,開頭匹配
- 帶有~或~*修飾符的,如果正則表達式與URI匹配
- 沒有修飾符的精確匹配
訪問控制
用於location段
allow:設定允許哪台或哪些主機訪問,多個參數需要寫多條
deny:設定禁止哪台或哪些主機訪問,多個參數需要寫多條
示例:
allow 192.168.1.1/32;
allow 172.16.0.0/16;
deny all;
6.11 基於用戶認證
auth_basic "歡迎信息";
auth_basic_user_file "/path/to/user_auth_file"
user_auth_file內容格式為:
username:password
這裡的密碼為加密後的密碼串,建議用htpasswd來創建此文件:
htpasswd -c -m /path/to/.user_auth_file USERNAME
https配置
生成私鑰,生成證書簽署請求並獲得證書,然後在nginx.conf中配置如下內容:
server {
listen 443 ssl;
server_name www.idfsoft.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
開啟狀態界面
開啟status:
location /status {
stub_status {on | off};
allow 172.16.0.0/16; #
deny all;
}
訪問狀態頁面的方式:http://server_ip/status
狀態頁面信息詳解:
狀態碼 | 表示的意義 |
---|---|
Active connections 2 | 當前所有處於打開狀態的連接數 |
accepts | 總共處理了多少個連接 |
handled | 成功創建多少握手 |
requests | 總共處理了多少個請求 |
Reading | nginx讀取到客戶端的Header信息數,表示正處於接收請求狀態的連接數 |
Writing | nginx返回給客戶端的Header信息數,表示請求已經接收完成,且正處於處理請求或發送響應的過程中的連接數 |
Waiting | 開啟keep-alive的情況下,這個值等於active - (reading + writing),意思就是Nginx已處理完正在等候下一次請求指令的駐留連接 |
rewrite
語法:rewrite regex replacement flag;
,如:
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
此處的$1用於引用(.*.jpg)匹配到的內容,又如:
rewrite ^/bbs/(.*)$ http://www.idfsoft.com/index.html redirect
如上例所示,replacement可以是某個路徑,也可以是某個URL
常見的flag
flag | 作用 |
---|---|
last | 基本上都用這個flag,表示當前的匹配結束,繼續下一個匹配,最多匹配10個到20個。一旦此rewrite規則重寫完成後,就不再被後面其它的rewrite規則進行處理而是由UserAgent重新對重寫後的URL再一次發起請求,並從頭開始執行類似的過程 |
break | 中止Rewrite,不再繼續匹配。一旦此rewrite規則重寫完成後,由UserAgent對新的URL重新發起請求,且不再會被當前location內的任何rewrite規則所檢查 |
redirect | 測試或應用程式使用,以臨時重定向的HTTP狀態302返回新的URL |
permanent | 測試或應用程式使用,以永久重定向的HTTP狀態301返回新的URL |
rewrite模塊的作用是用來執行URL重定向。這個機制有利於去掉惡意訪問的url,也有利於搜索引擎優化(SEO)
nginx使用的語法源於Perl相容正則表達式(PCRE)庫,基本語法如下:
標識符 | 意義 |
---|---|
^ | 必須以^後的實體開頭 |
$ | 必須以$前的實體結尾 |
. | 匹配任意字元 |
[] | 匹配指定字元集內的任意字元 |
[^] | 匹配任何不包括在指定字元集內的任意字元串 |
豎線符 | 匹配 豎線符 之前或之後的實體 |
() | 分組,組成一組用於匹配的實體,通常會有 豎線符 來協助 |
捕獲子表達式,可以捕獲放在()之間的任何文本,比如:
^(hello|sir)$
#字元串為“hi sir”捕獲的結果:$1=hi$2=sir
#這些被捕獲的數據,在後面就可以當變數一樣使用了
if
語法:if (condition) {...}
應用場景:
- server段
- location段
常見的condition
- 變數名(變數值為空串,或者以“0”開始,則為false,其它的均為true)
- 以變數為操作數構成的比較表達式(可使用=,!=類似的比較操作符進行測試)
- 正則表達式的模式匹配操作
- ~:區分大小寫的模式匹配檢查
- ~*:不區分大小寫的模式匹配檢查
- !~和!~*:對上面兩種測試取反
- 測試指定路徑為文件的可能性(-f,!-f)
- 測試指定路徑為目錄的可能性(-d,!-d)
- 測試文件的存在性(-e,!-e)
- 檢查文件是否有執行許可權(-x,!-x)
防盜鏈案例
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked www.idfsoft.com;
if ($invalid_referer) {
rewrite ^/ http://www.idfsoft.com/403.html;
}
}
反向代理與負載均衡
nginx通常被用作後端伺服器的反向代理,這樣就可以很方便的實現動靜分離以及負載均衡,從而大大提高伺服器的處理能力。
nginx實現動靜分離,其實就是在反向代理的時候,如果是靜態資源,就直接從nginx發佈的路徑去讀取,而不需要從後臺伺服器獲取了。
但是要註意,這種情況下需要保證後端跟前端的程式保持一致,可以使用Rsync做服務端自動同步或者使用NFS、MFS分散式共用存儲。
Http Proxy模塊,功能很多,最常用的是proxy_pass和proxy_cache
如果要使用proxy_cache,需要集成第三方的ngx_cache_purge模塊,用來清除指定的URL緩存。這個集成需要在安裝nginx的時候去做,如:
./configure --add-module=../ngx_cache_purge-1.0 ......
nginx通過upstream模塊來實現簡單的負載均衡,upstream需要定義在http段內
在upstream段內,定義一個伺服器列表,預設的方式是輪詢,如果要確定同一個訪問者發出的請求總是由同一個後端伺服器來處理,可以設置ip_hash,如:
upstream idfsoft.com {
ip_hash;
server 127.0.0.1:9080 weight=5; #weight,權重,例如本例中,效果為前五個訪問的IP分配給9080埠,後面五個訪問的IP分配給8080,最後一個訪問的IP分配給1111,然後迴圈進行此過程。
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:1111;
}
註意:這個方法本質還是輪詢,而且由於客戶端的ip可能是不斷變化的,比如動態ip,代理,FQ等,因此ip_hash並不能完全保證同一個客戶端總是由同一個伺服器來處理。
定義好upstream後,需要在server段內添加如下內容:
server {
location / {
proxy_pass http://idfsoft.com;
}
}
nginx的安裝與配置
安裝nginx
[root@Hyrule ~]# useradd -r -M -s /sbin/nologin nginx
[root@Hyrule ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
[root@Hyrule ~]# yum -y groups mark install 'Development Tools'
[root@Hyrule ~]# mkdir -p /var/log/nginx
[root@Hyrule ~]# chown -R nginx.nginx /var/log/nginx
[root@Hyrule ~]# cd /usr/src/
[root@Hyrule src]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
[root@Hyrule src]# tar xf nginx-1.14.2.tar.gz
[root@Hyrule src]# cd nginx-1.14.2
[root@Hyrule nginx-1.14.2]# ./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@Hyrule nginx-1.14.2]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
[root@Hyrule ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@Hyrule ~]# . /etc/profile.d/nginx.sh
[root@Hyrule ~]# nginx
[root@Hyrule ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:10050 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 80 :::3306 :::*
添加nginx為系統服務
#編寫nginx的啟動腳本
[root@Hyrule ~]# vim nginx_service.sh
#!/bin/bash
#
# chkconfig: - 85 15
# description: nginx
# processname: nginx
nginx=/usr/local/nginx/sbin/nginx
conf=/usr/local/nginx/conf/nginx.conf
case $1 in
start)
$nginx -c
$conf
;;
stop)
killall -9 nginx
;;
restart)
killall -9 nginx
$nginx -c
$conf
*)
echo "Usage: service {start|stop|restart}"
;;
[root@Hyrule ~]# chmod +x nginx_service.sh
#將
[root@Hyrule ~]# cp nginx_service.sh /etc/init.d/nginx
[root@Hyrule ~]# chkconfig –add nginx