作為乙個 nginx 的初學者記錄一下從零起步的點滴。
nginx 最常的用途是提供反向**服務,那麼什麼反向**呢?正向**相信很多大陸同胞都在這片神奇的土地上用過了,原理大致如下圖:
**伺服器作為客戶端這邊的中介接受請求,隱藏掉真實的客戶,向伺服器獲取資源。如果**伺服器在長城外的話還能順便幫助我們實現翻越長城的目的。而反向**顧名思義就是反過來**伺服器作為伺服器的中介,隱藏掉真實提供服務的伺服器,原理大致如下圖:
這麼做當然不是為了實現翻越長城,而是為了實現安全和負載均衡等一系列的功能。所謂安全指客戶端的請求不會直接落到內網的伺服器上而是通過**做了 一層**,在這一層就可以實現安全過濾,流控,防 ddos 等一系列策略。而負載均衡指我們可以水平擴充套件後端真正提供服務的伺服器數量,**按規則**請求到各個伺服器,使得各個伺服器的負載接近均衡。
而 nginx 就是目前流行的這樣乙個反向**服務。
在 ubuntu 下,可以捨去編譯安裝的過程,直接 apt-get
sudo apt-get install nginx安裝好之後可以直接通過:
sudo service nginx start來啟動 nginx 服務,nginx 預設設定了 80 埠的**,我們可以再瀏覽器訪問 http://locallhost 來進行檢查。
nginx 的預設配置檔案位於
/etc/nginx/nginx.conf
include /etc/nginx/sites-enabled/*;這一行載入了乙個外部的配置檔案,sites-enabled 資料夾下只有乙個 default 檔案,這個外部的配置檔案就是負責我們 nginx 的預設**。將配置的內容縮水後,得到下面幾行:
server乙個大型的**通常會有很多下屬的站點,有各自的伺服器提供相應的服務,在 nginx 中我們可以通過乙個叫虛擬主機的概念來將這些不同的服務配置隔離,這就是上面配置中的 server 的含義。舉例來說 google 旗下有翻譯和學術兩款產品我們就可以在 nginx 的配置檔案中配置兩個 server,servername 分別為 translate.google.com 和 scholar.google.com,這樣的話不同的 url 請求就會對應到 nginx 相應的設定,**到不同的後端伺服器上。這裡的 servername 是和客戶端 http 請求中的 host 行進行匹配的。}
本例中 server_name 為 localhost,這就是為什麼我們可以在瀏覽器通過 localhost 訪問到頁面的配置。下面兩個 listen 分別對應了 ipv4 和 ipv6 下的監聽埠如果設為 8080,那麼我們就只能通過 localhost:8080 來訪問到預設頁面了。
default_server 的含義是指如果有其他 http 請求的 host 在 nginx 中不存在設定的話那麼就用這個 server 的配置來處理。比如我們去訪問 127.0.0.1 那麼也會落到這個 server 來處理。
每個 url 請求都會對應的乙個服務,nginx 進行處理**或者是本地的乙個檔案路徑,或者是其他伺服器的乙個服務路徑。而這個路徑的匹配是通過 location 來進行的。我們可以將 server 當做對應乙個網域名稱進行的配置,而 location 是在乙個網域名稱下對更精細的路徑進行配置。
在這裡 location 匹配 / 開始的所有請求,即 localhost 下的 /*** 或者 /yyy 都要走下面的配置,除了這種簡單粗暴的匹配,nginx 也支援正則和完全相等及其他的精細匹配方式。而 tryfiles 意思是 nginx 會按照接下來的順序去訪問檔案,將第乙個匹配的返回。比如你去請求 localhost/test,他會去尋找 /test 檔案,找不到再去找 /test/ 再找不到就返回乙個 404。此外我們還可以在 location 的配置裡用 proxypass 實現反向**和負載均衡,不過這個最簡單的配置並沒有涉及。
其中 root 是指將本地的乙個資料夾作為所有 url 請求的根路徑。比如使用者請求了乙個 localhost/test,那麼 nginx 就會去需找 /usr/share/nginx/html 資料夾下的 test 檔案返回。
而 index 就是預設的訪問頁面了,當我們訪問 localhost 時,他會自動按順序尋找 root 檔案路徑下的 index.html 和 index.htm 將第乙個找到的結果返回。
location 定義規則匹配請求並處理
=:精確匹配
~區分大小寫正則匹配
~*不區分大小寫正則匹配
^~普通字元匹配
@內部定向使用
上面的配置只是將使用者的 url 對映到本地的檔案,並沒有實現傳說中的反向**和負載均衡(當然 nginx 做靜態檔案的分發也是想到的厲害),下面我們就來進一步配置 location 看看怎麼實現。
配置起來很簡單比如我要將所有的請求到轉移到真正提供服務的一台機器的 8080 埠,只要這樣:
location /這樣所有的請求就都被反向**到 123.34.56.67 去了。這樣我們反向**的功能是實現了,可是就能**到一台伺服器上哪有什麼負載均衡呀?這就要用到 nginx 的 upstream 模組了。
upstream backend我們在 upstream 中指定了一組機器,並將這個組命名為 backend,這樣在 proxypass 中只要將請求轉移到 backend 這個 upstream 中我們就實現了在四台機器的反向**加負載均衡。其中的 iphash 指明了我們均衡的方式是按照使用者的 ip 位址進行分配。location /
要讓配置生效,我們不必重啟 nginx 只需要 reload 配置即可。
sudo service nginx reload以上是最簡單的通過 nginx 實現靜態檔案**、反向**和負載均衡的配置。在 nginx 中所有的功能都是通過模組來實現的,比如當我們配置 upstream 時是對 upstream 模組,而 server 和 location 是在 http core 模組,其他的還有流控的 limt 模組,郵件的 mail 模組,https 的 ssl 模組。他們的配置都是類似的可以再 nginx 的模組文件中找到詳細的配置說明。
nginx(一)基本配置講解
中文手冊 配置檔案詳解 如果主程序以root執行,nginx將會呼叫setuid setgid 來設定使用者 組,如果沒有指定組,那麼將使用與使用者名稱相同的組,預設情況下會使用nobody使用者與nobody組 或者nogroup 或者在編譯時指定的 user user和 group group的...
最基本的委託
有些教材,部落格說到委託都會提到事件,雖然事件是委託的乙個例項,但是為了理解起來更簡單,今天只談委託不談事件。先上一段 下邊的 完成了乙個委託應用的演示。乙個委託分三個步驟 public partial class webform3 system.web.ui.page step02 宣告乙個方法來...
最基本的操作
關於目錄的獲取 獲取沙盒目錄 算是跟目錄吧 nshomedirectory 獲取document目錄 常用 let paths nssearchpathfordirectoriesindomains documentdirectory,userdomainmask,true first 或者 fil...