1. 程式人生 > >nginx入門安裝配置與使用詳解

nginx入門安裝配置與使用詳解

本文內容: 

1. nginx 簡介 

2. nginx 安裝配置 

3. nginx使用

4.nginx配置location總結及rewrite規則寫法


一、Nginx 的三大功能

 

1.HTTP伺服器

Nginx是一個HTTP伺服器,可以將伺服器上的靜態檔案(如HTML、圖片)通過HTTP協議展現給客戶端。

2.反向代理伺服器

Nginx也是反向代理伺服器。

說反向代理之前先說一下正向代理,正向代理相信很多大陸同胞都在這片神奇的土地上用過了。就是訪問國外網被牆了,然後找個代理服務,通過該伺服器訪問國外網站,這個是正向代理。

反向代理是 客戶端訪問代理伺服器,但是代理伺服器沒有使用者需要的資源,然後代理伺服器偷偷訪問應用伺服器,獲取資源返回給使用者,使用者不知道代理伺服器是訪問了應用伺服器,代理伺服器也隱藏了應用伺服器的url。(反向代理的典型用途是將 防火牆後面的伺服器提供給Internet使用者訪問)

 

3.負載均衡

Nginx可以通過反向代理來實現負載均衡。

 


二、Nginx 安裝

 

2.1 CentOS 7 安裝 Nginx

2.1.1.新增Nginx到YUM源

新增CentOS 7 Nginx yum資源庫,開啟終端,使用以下命令:

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

 

2.2.2.安裝Nginx

在你的CentOS 7 伺服器中使用yum命令從Nginx源伺服器中獲取來安裝Nginx:

sudo yum install -y nginx

Nginx將完成安裝在你的CentOS 7 伺服器中。

2.2.3. Nginx啟動

nginx -c nginx.conf

啟動後就可以訪問 域名或者本機IP 如果出現Nginx,說明啟動成功。

2.2.4. Nginx 停止

//查詢出nginx的pid ps -ef|grep nginx //通過kill 命令殺死 nginx kill pid

 

2.2.5. Nginx配置資訊

網站檔案存放預設目錄

/usr/share/nginx/html

網站預設站點配置

/etc/nginx/conf.d/default.conf

自定義Nginx站點配置檔案存放目錄

/etc/nginx/conf.d/

Nginx全域性配置

/etc/nginx/nginx.conf


2.2 docker 安裝 Nginx

2.2.1下載映象,

docker pull nginx:1.9

2.2.2 啟動容器,

docker run -d -p 8080:80 nginx:1.9

把容器內的nginx的80埠,對映到當前伺服器的8080埠,假設當前伺服器的ip是192.168.0.100,瀏覽器輸入http://192.168.0.100:8080/,就可以看到nginx已啟動,


三、Nginx 使用

關於靜態資源伺服器的使用這裡就不做說明了。

3.1 反向代理

小例子:實現訪問本機 ip 然後代理 我的博地址 ,也就是在瀏覽器輸入本機地址,然後跳轉到我的部落格。

3.1.1 本地安裝nginx

如果是本地安裝的nginx 的話需要修改 /etc/nginx/conf.d/default.conf 配置檔案

註釋原有的 location 然後替換為新的location

//註釋原有的 # location / { # root /usr/share/nginx/html; # index index.html index.htm; # } //新新增的 location / { proxy_pass http://blog.csdn.net/u012373815?viewmode=list;

3.1.2 Docker 安裝

如果是docker 安裝的話,需要本地隨意目錄下新建default.conf 檔案,內容如下:

server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; location / { proxy_pass http://blog.csdn.net/u012373815?viewmode=list; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

然後重新啟動容器,將default.conf 檔案對映到docker容器內。 

啟動命令如下:

docker run -p 8080:80 --name myNginx -v /本地路徑/default.conf:/etc/nginx/conf.d/default.conf -d nginx:1.9

3.2 負載均衡

  上面的配置只實現了反向代理沒有實現傳說中的負載均衡。所有的請求就都被反向代理到 我的部落格地址去了。這樣我們反向代理的功能是實現了,可是就能代理到一臺伺服器上哪有什麼負載均衡呀?這就要用到 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 配置即可。

負載均衡配置示例

   假設這樣一個應用場景:將應用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三臺 linux 環境的伺服器上。網站域名叫 www.helloworld.com,公網 IP 為 192.168.1.11。在公網 IP 所在的伺服器上部署 nginx,對所有請求做負載均衡處理。

nginx.conf 配置如下:

http { #設定mime型別,型別由mime.type檔案定義 include /etc/nginx/mime.types; default_type application/octet-stream; #設定日誌格式 access_log /var/log/nginx/access.log; #設定負載均衡的伺服器列表 upstream load_balance_server { #weigth引數表示權值,權值越高被分配到的機率越大 server 192.168.1.11:80 weight=5; server 192.168.1.12:80 weight=1; server 192.168.1.13:80 weight=6; } #HTTP伺服器 server { #偵聽80埠 listen 80; #定義使用www.xx.com訪問 server_name www.helloworld.com; #對所有請求進行負載均衡請求 location / { root /root; #定義伺服器的預設網站根目錄位置 index index.html index.htm; #定義首頁索引檔案的名稱 proxy_pass http://load_balance_server ;#請求轉向load_balance_server 定義的伺服器列表 #以下是一些反向代理的配置(可選擇性配置) #proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #後端的Web伺服器可以通過X-Forwarded-For獲取使用者真實IP proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 90; #nginx跟後端伺服器連線超時時間(代理連線超時) proxy_send_timeout 90; #後端伺服器資料回傳時間(代理髮送超時) proxy_read_timeout 90; #連線成功後,後端伺服器響應時間(代理接收超時) proxy_buffer_size 4k; #設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小 proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定 proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #設定快取資料夾大小,大於這個值,將從upstream伺服器傳 client_max_body_size 10m; #允許客戶端請求的最大單檔案位元組數 client_body_buffer_size 128k; #緩衝區代理緩衝使用者端請求的最大位元組數 } } }

 

四、nginx配置location總結及rewrite規則寫法

4.1 正則

  • . : 匹配除換行符以外的任意字元
  • ? : 重複0次或1次
  • + : 重複1次或更多次
  • * : 重複0次或更多次
  • \d :匹配數字
  • ^ : 匹配字串的開始
  • $ : 匹配字串的介紹
  • {n} : 重複n次
  • {n,} : 重複n次或更多次
  • [c] : 匹配單個字元c
  • [a-z] : 匹配a-z小寫字母的任意一個

~ 區分大小寫匹配

~* 不區分大小寫匹配

!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配

^ 以什麼開頭的匹配

$ 以什麼結尾的匹配

  • 小括號()之間匹配的內容,可以在後面通過$1來引用,$2表示的是前面第二個()裡的內容。正則裡面容易讓人困惑的是\轉義特殊字元。

4.2 常用變數

  • $args : #這個變數等於請求行中的引數,同$query_string
  • $content_length : 請求頭中的Content-length欄位。
  • $content_type : 請求頭中的Content-Type欄位。
  • $document_root : 當前請求在root指令中指定的值。
  • $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相同。

4.3 flag標誌位

  • last : 相當於Apache的[L]標記,表示完成rewrite
  • break : 停止執行當前虛擬主機的後續rewrite指令集
  • redirect : 返回302臨時重定向,位址列會顯示跳轉後的地址
  • permanent : 返回301永久重定向,位址列會顯示跳轉後的地址

#路徑重寫配置Demo location /demo/test/ { #以/demo/test路徑開始 #原始路徑: http://127.0.0.1:8080/demo/test/1.html 重寫後:http://127.0.0.1:8888/demo/test2/1.html rewrite ^/demo/test/(.*)$ http://127.0.0.1:8888/demo/test2/$1 break; #以html檔案結尾 #原始路徑: http://127.0.0.1:8080/demo/test/1.html 重寫後:http://127.0.0.1:8888/test/demo/test/1.html # 此種方式配置會改變瀏覽器地址,引發跨域請求的問題 #rewrite ^/(.*\.html)$ http://127.0.0.1:8888/test/$1 break; # 此種方式,結合proxy_pass 重寫後則不會改變瀏覽器地址,不存在跨域問題 #rewrite ^/(.*\.html)$ /test/$1 break; #proxy_pass http://127.0.0.1:8888; }

參考資料: 

http://blog.csdn.net/u012486840/article/details/52610320 

http://www.jb51.net/article/61137.htm

http://seanlook.com/2015/05/17/nginx-location-rewrite/