轉自:http://oilbeater.com/nginx/2014/12/29/nginx-conf-from-zero.html
基本概念
Nginx 最常的用途是提供反向代理服務,那麼什麼反向代理呢?正向代理相信許多大陸同胞都在這片神奇的土地上用過了,原理大致如下圖:
代理伺服器作為客戶端這邊的中介接受請求,隱藏掉真實的客戶,向伺服器獲取資源。如果代理伺服器在長城外的話還能順便幫助我們實現翻越長城的目的。而反向代理顧名思義就是反過來代理伺服器作為伺服器的中介,隱藏掉真實提供服務的伺服器,原理大致如下圖:
這麼做當然不是為了實現翻越長城,而是為了實現安全和負載平衡等一系列的功能。所謂安全指客戶端的請求不會直接落到內網的伺服器上而是透過代理做了一層轉發,在這一層就可以實現安全過濾,流控,防 DDOS 等一系列策略。而負載平衡指我們可以水平擴展後端真正提供服務的伺服器數量,代理依照規則轉發請求到各個伺服器,使得各個伺服器的負載接近平衡。
而 nginx 就是目前流行的這樣一個反向代理服務。
安裝
在Ubuntu 下,可以捨去編譯安裝的過程,直接apt-get
<code>sudo apt-get install nginx </code>
安裝好之後可以直接通過:
<code>sudo service nginx start </code>
安裝好之後可以直接通過:
<code>/etc/nginx/nginx.conf </code>
<code>include /etc/nginx/sites-enabled/*; </code>
<code>server { server_name localhost; listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } } </code>
<code>location / {
proxy_pass 123.34.56.67:8080;
}
</code>
name 分別為translate.google.com 和scholar.google.com,這樣的話不同的url 請求就會對應到nginx 相應的設置,轉送到不同的後端伺服器。這裡的 server
name 是和客戶端 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 下的 /xxx 或 /yyy 都要走下面的配置,除了這種簡單粗暴的匹配,nginx 也支持正則和完全相等及其他的精細匹配方式。而 tryfiles 意思是 nginx 會按照接下來的順序去存取文件,將第一個匹配的返回。例如你去要求 localhost/test,他會去找 /test 文件,找不到再去找 /test/ 再找不到就回傳一個 404。另外我們也可以在 location 的設定裡用 proxy
pass 實現反向代理和負載平衡,不過這個最簡單的配置並沒有涉及。 其中 root 是指將本地的一個資料夾作為所有 url 請求的根路徑。例如使用者請求了一個 localhost/test,那麼 nginx 就會去需找 /usr/share/nginx/html 資料夾下的 test 檔案回傳。 而 index 就是預設的存取頁面了,當我們造訪 localhost 時,他會自動依序尋找 root 檔案路徑下的 index.html 和 index.htm 將第一個找到的結果回傳。 🎜🎜location 進階配置🎜上面的配置只是将用户的 url 映射到本地的文件,并没有实现传说中的反向代理和负载均衡(当然 nginx 做静态文件的分发也是想到的厉害),下面我们就来进一步配置 location 看看怎么实现。
配置起来很简单比如我要将所有的请求到转移到真正提供服务的一台机器的 8080 端口,只要这样:
<code>location / { proxy_pass 123.34.56.67:8080; } </code>
这样所有的请求就都被反向代理到 123.34.56.67 去了。这样我们反向代理的功能是实现了,可是就能代理到一台服务器上哪有什么负载均衡呀?这就要用到 nginx 的 upstream 模块了。
<code>upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com; server backend4.example.com; } location / { proxy_pass http://backend; } </code>
我们在 upstream 中指定了一组机器,并将这个组命名为 backend,这样在 proxypass 中只要将请求转移到 backend 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。其中的 iphash 指明了我们均衡的方式是按照用户的 ip 地址进行分配。
要让配置生效,我们不必重启 nginx 只需要 reload 配置即可。
<code>sudo service nginx reload </code>
总结
以上是最简单的通过 nginx 实现静态文件转发、反向代理和负载均衡的配置。在 nginx 中所有的功能都是通过模块来实现的,比如当我们配置 upstream 时是对 upstream 模块,而 server 和 location 是在 http core 模块,其他的还有流控的 limt 模块,邮件的 mail 模块,https 的 ssl 模块。他们的配置都是类似的可以再 nginx 的模块文档中找到详细的配置说明。
以上就介绍了nginx 配置从零开始,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。