nginx基礎知識

什麼是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基礎知識

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等

匹配順序

  1. :“=“的精確匹配優先級最高,將會最先匹配
  2. :帶有“^~”修飾符的前綴匹配,並返回最長前綴的匹配結果
  3. :處理具有正則表達式(〜和〜 *)的所有位置指令。如果正則表達式與請求匹配,則nginx停止搜索並完成請求
  4. :如果以上都沒有匹配到,則匹配最長的前綴

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";
  1. 訪問根目錄/時將匹配規則A
  2. 訪問/static/index.html時將匹配規則B,訪問/static/files/1.html時則匹配規則C
  3. 訪問/a.png時, 將匹配規則D和規則E,但是規則D順序優先, 規則E不起作用,而/static/c.png則優先匹配到規則B
  4. 訪問/a.PNG時則匹配 規則E,而不會匹配規則D,因爲規則E不區分大小寫。
  5. 訪問/img/a.gif時會匹配上規則D ,雖然規則F也可以匹配上,但是因爲正則匹配優先,而忽略了規則F。
  6. 訪問/img/a.txt時會匹配上規則F 。
  7. 訪問/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

其他區別:

  1. alias 只能作用在location中,而root可以存在server、http和location中。
  2. alias 後面必須要用 “/” 結束,否則會找不到文件,而 root 則對 ”/” 可有可無。

歡迎關注個人微信公衆號“沒有故事的陳師傅”
nginx基礎知識

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章