Nginx 配置從零開始

做爲一個 nginx 的初學者記錄一下從零起步的點滴。html

基本概念

Nginx 最常的用途是提供反向代理服務,那麼什麼反向代理呢?正向代理相信不少大陸同胞都在這片神奇的土地上用過了,原理大體以下圖:nginx

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

學習配置最好的方式,就是從例子入手,咱們先不看其餘的配置,直接看和 nginx 默認頁面相關的配置。在配置文件中有一行:google

include /etc/nginx/sites-enabled/*;

這一行加載了一個外部的配置文件,sites-enabled 文件夾下只有一個 default 文件,這個外部的配置文件就是負責咱們 nginx 的默認代理。將配置的內容縮水後,獲得下面幾行:

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;
    }
}

一個大型的網站一般會有不少下屬的站點,有各自的服務器提供相應的服務,在 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 下的 /xxx 或者 /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 / {
    proxy_pass 123.34.56.67:8080;
}

這樣全部的請求就都被反向代理到 123.34.56.67 去了。這樣咱們反向代理的功能是實現了,但是就能代理到一臺服務器上哪有什麼負載均衡呀?這就要用到 nginx 的 upstream 模塊了。

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;
}

咱們在 upstream 中指定了一組機器,並將這個組命名爲 backend,這樣在 proxypass 中只要將請求轉移到 backend 這個 upstream 中咱們就實現了在四臺機器的反向代理加負載均衡。其中的 iphash 指明瞭咱們均衡的方式是按照用戶的 ip 地址進行分配。

要讓配置生效,咱們沒必要重啓 nginx 只須要 reload 配置便可。

sudo service nginx reload

總結

以上是最簡單的經過 nginx 實現靜態文件轉發、反向代理和負載均衡的配置。在 nginx 中全部的功能都是經過模塊來實現的,好比當咱們配置 upstream 時是對 upstream 模塊,而 server 和 location 是在 http core 模塊,其餘的還有流控的 limt 模塊,郵件的 mail 模塊,https 的 ssl 模塊。他們的配置都是相似的能夠再 nginx 的模塊文檔中找到詳細的配置說明。


歡迎你們在討論區有血性的爭論、動手、拍磚、捅刀子,亮出你的見解來!本博客已經全文RSS輸出,你們能夠經過訂閱oilbeater.com/atom.html便可得到博客更新。或者關注個人微博@oilbeater在上面我會通知個人博客更新而且還會分享一些有意思的技術文章,歡迎你們關注。

相關文章
相關標籤/搜索