什麼是nginx?
NGINX是一個免費的,開源的,高性能的HTTP服務器和反向代理,以及IMAP / POP3代理服務器。NGINX以其高性能,穩定性,豐富的功能集,簡單的配置和低資源消耗而聞名。
nginx能做什麼?
NGINX是用於Web服務,反向代理,緩存,負載平衡,媒體流等的開源軟件。它最初是一個旨在實現最高性能和穩定性的Web服務器。除了HTTP服務器功能外,NGINX還可以用作電子郵件(IMAP,POP3和SMTP)的代理服務器以及HTTP,TCP和UDP服務器的反向代理和負載平衡器。
nginx安裝方法
yum安裝
1.安裝utils
yum install yum-utils
2.配置yum倉庫
vim /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
[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
3. 安裝nginx
yum install nginx
編譯安裝
1.下載並解壓源碼
wget http://nginx.org/download/nginx-1.9.4.tar.gz
tar -xzf nginx-1.9.4.tar.gz
cd nginx-1.9.4
2.安裝編譯環境
yum update
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
3.編譯安裝
添加用戶和組
groupadd www
useradd -g www www
配置
./configure \
--user=www \
--group=www \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-threads
編譯
make
安裝
make install
4.創建軟鏈接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
5.啓動程序
nginx/sbin/nginx
nginx命令
- nginx #打開 nginx,
- nginx -t #測試配置文件是否有語法錯誤
- nginx -s reopen #重新打開nginx日誌,對應USR1信號,即kil -9 USR1 pid
- nginx -s reload #在不重啓的情況下重新加載Nginx配置文件,對應HUP信號,即kill -9 HUP pid
- nginx -s stop #強制停止Nginx服務,對應TERM信號或者INT信號,即kill -9 TERM|INT pid
- nginx -s quit #優雅地停止Nginx服務(即處理完所有請求後再停止服務),對應QUIT信號,即kill -9 QUIT pid
配置文件的結構
nginx由模塊組成,這些模塊由配置文件中指定的指令控制。指令分爲簡單指令和塊指令。一個簡單的指令由名稱和參數組成,用空格分隔,以分號(;)結尾。塊指令與簡單指令具有相同的結構,但它不是以分號結尾,而是以大括號({和})包圍的一組附加指令結束。如果塊指令在大括號內可以有其他指令,則稱爲上下文(示例: events, http, server和 location)。
http塊包含處理Web流量的指令。這些指令通常被稱爲通用指令,因爲它們被傳遞給NGINX服務的所有網站配置。http中可以配置多個server,一個server中可以配置多個location,除了http塊、server塊和location塊之外,還有events塊、stream塊等
塊指令和簡單指令是有一定的對應關係的,比如,有些簡單指令只能在http塊中配置,有些簡單指令只能在server塊中配置,有些簡單指令只能在location塊中配置,有些簡單指令既能在server塊中配置又能在http塊中配置,可以在官網中(http://nginx.org/en/docs/)查看指令存在的位置,而最上方不屬於任何塊的配置指令的區域屬於主配置區,用於定義網站的全局配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
...
}
http {
...
server {
...
location ... {
... ...
}
}
server {
...
}
}
nginx事件驅動模型
Nginx是以事件的觸發來驅動的web服務器,Nginx服務器響應和處理Web請求的過程,就是基於事件驅動模型的,事件驅動模型包括事件收集器,事件發送器,事件處理器,事件收集器負責收集所有事件,事件包括來自軟件、硬件以及用戶的,事件發送器負責將收集器收集到的事件發送到目標對象,事件處理器負責具體事件的響應,事件包括讀事件,寫事件以及異常事件。
事件驅動模型中事件處理器的實現方式
- 事件發送器每傳遞一個請求,目標對象就創建一個進程,調用事件處理器處理該請求。
- 事件發送器每傳遞一個請求,目標對象就創建一個線程,調用事件處理器來處理該請求。
- 事件發送器每傳遞一個請求,目標對象就將其放入一個待處理事件的列表(請求隊列),使用非阻塞I/O方式調用事件處理器來處理該請求。
nginx事件驅動模型庫
select
爲三類事件分別創建一個事件描述符集合,分別用來收集讀事件的描述符、寫事件的描述符和異常事件的描述符,調用底層select()函數,等待事件發生。然後遍歷三個集合中的事件描述符,當檢測到事件發生時就處理該事件,select受最大文件描述符的限制
poll
爲三類事件創建一個集合,最後輪詢的時候,可以同時檢查這三種事件是否發生
epoll
把描述符列表的管理交給內核負責,一旦有某種事件發生,內核把發生事件的描述符列表通知給進程,這樣就避免了輪詢整個描述符列表。epoll庫通過相關調用通知內核創建一個待處理的事件列表,當某一事件發生後,內核將發生事件的描述符列表上報給epoll庫,得到事件列表的epoll庫,就可以進行事件處理了。
nginx全局變量
- nginx變量索引:http://nginx.org/en/docs/varindex.html
- $args #這個變量等於請求行中的參數,同$query_string;
- $content_length #請求頭中的Content-length字段;
- $content_type #請求頭中的Content-Type字段;
- $document_root #當前請求在root指令中指定的值,如:root /var/www/html;
- $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_filename #當前請求的文件路徑,由root或alias指令與URI請求生成;
- $scheme #HTTP方法(如http,https);
- $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”;
- $document_uri #與$uri相同,例:http://localhost:88/test1/test2/test.php;
nginx訪問認證
nginx訪問認證需要用到auth_basic模塊,此模塊使用的是HTTP Basic Authentication協議來對用戶進行訪問控制,但此模塊並不保證安全性,因爲瀏覽器是以明文方式將用戶名和密碼傳給Web服務器的
指令解釋
auth_basic語法
語法 | auth_basic string 丨 off; |
---|---|
默認 | auth_basic off; |
應用位置 | http,server,location,limit_except |
string字符會在用戶認證的彈窗中顯示
auth_basic_user_file語法
語法 | auth_basic_user_file file; |
---|---|
默認 | - |
應用位置 | http,server,location,limit_except |
指定保存用戶名和密碼的文件
使用htpasswd創建密碼文件
htpasswd命令語法
htpasswd [-cimBdpsDv] [-C cost] passwordfile username
htpasswd -b[cmBdpsDv] [-C cost] passwordfile username password
htpasswd -n[imBdps] [-C cost] username
htpasswd -nb[mBdps] [-C cost] username password
htpasswd命令參數
-c 創建密碼文件
-n 將加密後的內容輸出在屏幕上;
-m 默認採用MD5算法對密碼進行加密
-d 採用CRYPT算法對密碼進行加密
-p 不對密碼文件中的密碼進行加密,即使用普通文本格式的密碼
-s 採用SHA算法對密碼進行加密
-b 命令行中一併輸入用戶名和密碼而不是根據提示輸入密碼,可以看見明文,不需要交互
-D 從密碼文件中刪除指定的用戶
訪問認證實例
下面我們通過auth認證來對kibana進行用戶登錄認證
修改nginx配置文件
location /kibana/ {
auth_basic "kibana";
auth_basic_user_file /etc/nginx/kibanauser;
proxy_pass http://127.0.0.1:5601/;
proxy_set_header Host $host:5601;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite ^/kibana/(.*)$ /$1 break;
}
使用htpasswd生成密碼文件
htpasswd -c /etc/nginx/kibanauser admin
進行訪問測試
nginx虛擬機主機配置
1.配置基於域名的虛擬主機
編輯nginx配置文件
vim /etc/nginx/nginx.conf
server {
listen 80 default_server;
server_name huazai.com;
location / {
root html/huazai;
index index.html;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
server {
listen 80;
server_name wanger.com;
location / {
root html/wanger;
index index.html;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
配置首頁文件並重載nginx
cd /usr/share/nginx/html/
mkdir wanger
mkdir huazai
echo "I'm huazai" >huazai/index.html
echo "I'm wanger" >wanger/index.html
chmod -R 777 wanger/
chmod -R 777 huazai/
nginx -s reload
訪問虛擬主機
curl -xlocalhost:80 huazai.com
I'm huazai
curl -xlocalhost:80 wanger.com
I'm wanger
2.配置基於端口的虛擬主機
編輯配置文件
server {
listen 80 default_server;
server_name huazai.com;
location / {
root html/huazai;
index index.html;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
server {
listen 800;
server_name huazai.com;
location / {
root html/wanger;
index index.html;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
測試並重啓nginx
nginx -t
systemctl restart nginx
訪問虛擬主機
[root@ html]# curl 127.0.0.1:80
I'm huazai
[root@ html]# curl 127.0.0.1:800
I'm wanger
nginx location塊詳解
location指令的作用是根據用戶請求的URI來執行不同的應用。
location語法
location [=|~|~*|^~|@] uri {
……
}
匹配模式及順序
匹配模式
uri可以是普通的字符串地址,也可以是正則表達式,其中 ~ 和 ~ 用於正則表達式, 其他前綴和無任何前綴都用於普通字符,而~是區分大小寫的匹配,~用於不區分大小寫的匹配,還可以使用“!”對匹配進行取反,^~表示如果與特定的字符串進行匹配,那麼不在進行正則搜索, =表示精確前綴匹配,只有完全匹配才能生效,使用完全匹配可以略微加快請求時間,@定義命名location區段,這些區段客戶端不能訪問,只可以由內部產生的請求來訪問,如try_files或error_page等
匹配順序
- :“=“的精確匹配優先級最高,將會最先匹配
- :帶有“^~”修飾符的前綴匹配,並返回最長前綴的匹配結果
- :處理具有正則表達式(〜和〜 *)的所有位置指令。如果正則表達式與請求匹配,則nginx停止搜索並完成請求
- :如果以上都沒有匹配到,則匹配最長的前綴
location匹配實例
location = / {
return "規則A";
}
location ^~ /static/ {
return "規則B";
}
location ^~ /static/files {
return "規則C";
}
location ~ .*\.(gif|jpg|png|js|css)$ {
return "規則D";
}
location ~* \.png$ {
return "規則E";
}
location /img {
return "規則F";
}
location / {
return "規則G";
- 訪問根目錄/時將匹配規則A
- 訪問/static/index.html時將匹配規則B,訪問/static/files/1.html時則匹配規則C
- 訪問/a.png時, 將匹配規則D和規則E,但是規則D順序優先, 規則E不起作用,而/static/c.png則優先匹配到規則B
- 訪問/a.PNG時則匹配 規則E,而不會匹配規則D,因爲規則E不區分大小寫。
- 訪問/img/a.gif時會匹配上規則D ,雖然規則F也可以匹配上,但是因爲正則匹配優先,而忽略了規則F。
- 訪問/img/a.txt時會匹配上規則F 。
- 訪問/dev/test.py時會匹配規則G。
location的root與alias
root和alias都可以定義在location模塊中,都是用來指定請求資源的真實路徑
location /wanger {
root html;
index index.html;
}
curl 127.0.0.1/wanger/index.html
I'm wanger
客戶端請求http://127.0.0.1/wanger/index.html 地址時,在服務器的資源是/html/wanger/index.html,真實路徑是root加上location指定的值
location /wanger {
alias html/;
index index.html;
}
而alias是location指定的值的別名,也就是當客戶端請求http://127.0.0.1/wanger/index.html 時,在服務器的資源時/html/index.html,真實路徑是alias的路徑,此時訪問結果如下:
curl 127.0.0.1/wanger/index.html
I'm huazai
其他區別:
- alias 只能作用在location中,而root可以存在server、http和location中。
- alias 後面必須要用 “/” 結束,否則會找不到文件,而 root 則對 ”/” 可有可無。
歡迎關注個人微信公衆號“沒有故事的陳師傅”