安裝
在CentOS下,nginx官方提供了安裝包可以安裝
首先先安裝前置軟件
sudo yum install yum-utils
然后將nginx官方源加入到yum源中
#/etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
nginx分為穩定和主線分支兩個分支,默認為穩定分支,可以根據需要切換為主線分支sudo yum-config-manager --enable nginx-mainline
使用命令就可以安裝nginx了
sudo yum install nginx
nginx運行管理
執行nginx命令可以開啟服務器。
-?參數可以獲取更多命令行參數
nginx -s stop|quit|reload|reopen
可以控制服務器直接退出|結束工作並退出|重新加載配置文件(重啟)|重新打開日志文件
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
可以列出nginx的主進程pid和工作進程pid。
除了直接使用nginx命令管理服務器,還可以通過系統信號的方式向nginx傳遞信號,如kill -s QUIT 1628
nginx支持以下信號:
TERM, INT 直接關閉
QUIT 完成工作后關閉
HUP 重新加載配置並重啟
USR1 重新打開日志文件
USR2 升級可執行文件
WINCH 關閉正常工作進程
其中加粗的可以直接控制單個工作進程。
通過信號機制,可以在不停機的情況下切換日志文件或者升級ngnix程序。
nginx配置
配置文件
nginx的配置文件放在/usr/local/nginx/conf,/etc/nginx或 /usr/local/etc/nginx中,默認文件名為nginx.conf。
可以將nginx程序相關配置放在nginx.conf中,將具體的服務相關放在conf.d文件夾下,然后通過在nginx.conf中include進去(還可以創建一個servers文件夾,放配置文件,然后通過創建軟連接的方式鏈接到conf.d文件夾中,就可以通過命令行動態管理nginx配置)。
nginx配置文件以#為注釋符號,每行配置以;為結束符號。
nginx配置文件遵循全局包括events、http塊,http塊包括server塊,server塊包括location塊的結構。
nginx進行轉發匹配時,優先全部匹配,沒有完全匹配時進行最長的匹配。
... #全局塊
events { #events塊
...
}
http #http塊
{
... #http全局塊
server #server塊
{
... #server全局塊
location [PATTERN] #location塊,PATTERN支持正則表達式和等號判斷
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局塊
}
- 全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數等。
- events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網絡連接序列化等。
- http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
- server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
- location塊:配置請求的路由,以及各種頁面的處理情況。
塊命令
命令 | 位置 | 作用 | 參數 |
---|---|---|---|
use | 全局塊 | 可以設定鏈接處理方式 | select,poll,kqueue,epoll,/dev/poll,eventport之一,默認為前兩個,在Linux上推薦使用epoll |
error_log | 全局塊或server塊 | 可以設置服務器日志記錄文件和級別,下級弱設置項會被上級覆蓋 | 有debug、info、notice、warn、error、crit級別可選,可以記錄到文件也可以記錄到內存memory:32m debug; |
debug_connection | event塊 | 設定只記錄某個特定的IP的debug信息 | IP地址 |
servernames_hash_max_size | http塊 | nginx使用哈希表儲存信息,該項可以設定哈希表的最大大小 | 最好為CPU種cache的倍數 |
servernames_hash_bucket_size | http塊 | 該項可以設定哈希表的桶大小 | 最好為CPU種cache的倍數 |
listen | server塊 | 監聽端口號,可以通過default_server參數設定默認服務器,默認第一個為默認服務器 | 80等 |
server_name | server塊 | 進行匹配的服務名。該項支持正則表達式,此時必須以~作為開頭,包含{}的地址應加""符號 | 比如www.cnblogs.com或IP地址 |
return | server塊 | 返回值,比如返回444這樣的未定義的HTTP狀態碼 | 444 |
root | server或location塊 | 可以設定請求重定向到的目錄。 | 本地目錄 |
listen | server塊 | 可以設定server監聽的端口 | 端口號 |
proxy_pass | location塊 | 可以將請求進行代理轉發 | 地址和接口 |
fastcgi_pass | location塊 | 可以對PHP或其他語言提供的cgi接口進行代理轉發 | 地址和接口 |
fastcgi_param | location塊 | 傳遞參數 | 在PHP中,后跟SCRIPT_FILENAME和腳本名為轉發到某個腳本,后跟QUERY_STRING為轉發到腳本的參數字符串 |
變量列表
nginx中存在一些全局變量。
$args:這個變量等於請求行中的參數,同$query_string。
$is_args: 如果已經設置$args,則該變量的值為"?",否則為""。
$content_length: 請求頭中的Content-length字段。
$content_type: 請求頭中的Content-Type字段。
$document_uri: 與$uri相同。
$document_root: 當前請求在root指令中指定的值。
$host: 請求主機頭字段,否則為服務器名稱。
$http_user_agent: 客戶端agent信息。
$http_cookie: 客戶端cookie信息。
$limit_rate: 這個變量可以限制連接速率。
$request_method: 客戶端請求的動作,通常為GET或POST。
$remote_addr: 客戶端的IP地址。
$remote_port: 客戶端的端口。
$remote_user: 已經經過Auth Basic Module驗證的用戶名。
$request_body_file`: 客戶端請求主體的臨時文件名。
$request_uri: 請求的URI,帶參數
$request_filename: 當前請求的文件路徑,由root或alias指令與URI請求生成。
$scheme: 所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;。
$server_protocol: 請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
$server_addr: 服務器地址,在完成一次系統調用后可以確定這個值。
$server_name: 服務器名稱。
$server_port: 請求到達服務器的端口號。
$request_uri: 包含請求參數的原始URI,不包含主機名,如:/foo/bar.php?arg=baz,它無法修改。
$uri: 不帶請求參數的當前URI,$uri不包含主機名,如/foo/bar.html可能和最初的值有不同,比如經過重定向之類的。它可以通過內部重定向,或者使用index指令進行修改。不包括協議和主機名,例如/foo/bar.html。
反向代理
nginx的負載均衡功能依賴於ngx_http_upstream_module模塊,通過upstream偽指令設置后端,支持輪詢/帶權輪詢/最少鏈接/ip-hash四種方式。
例如:
upstream dynamic {
ip_hash
server backend1.example.com weight=5;
server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
server 192.0.2.1 max_fails=3;#最大失敗次數
server backend3.example.com resolve;
server backup1.example.com:8080 down;#暫不參與負載均衡
server backup2.example.com:8080 backup;#預留后備服務器
}
然后使用proxy_pass http://dynamic
這樣的命令即可進行反向代理。
njs
可以使用njs在配置文件中進行一些判斷或者流程控制。