Nginx簡介
Nginx(發音同engine x)是一個網頁服務器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的協議鏈接,以及一個負載均衡器和一個HTTP緩存。與舊版本(<=2.2)的Apache不同,nginx不採用每客戶機一線程的設計模型,而是充分使用異步邏輯(這一點與NodeJS
採取了相同的做法,支持高併發,Nginx在官方測試的結果中,能夠支持五萬個平行連接,而在實際的運作中,是可以支持二萬至四萬個平行鏈接),削減了上下文調度開銷,所以併發服務能力更強。整體採用模塊化設計,有豐富的模塊庫和第三方模塊庫,配置靈活。
Nginx的配置文件
使用Nginx
的方法就是寫配置文件,配置文件能完全控制Nginx
,使Nginx
按照我們的需求進行運行,所以配置文件的每一項的是幹啥的對我們來說就很重要了,具體配置文件各項的含義請參考 nginx.conf配置文件詳解,我這裏就不贅述了。
反向代理
準備工作
什麼是反向代理
?按照我的理解,反向代理
是相對於正向代理
來說的,因爲他們都是代理,所以我先來解釋一下什麼是代理。所謂代理,就是在客戶端和服務端之間強行添加了一層,用來實現流量轉發的功能,粗略的框圖如下:
+----------------+ +---------------+ +--------------+ | | | | | | | | | | | | | | http | | http | | | client <---------> proxy <--------> server | | | https | | https | | | | | | | | | | | | | | +----------------+ +---------------+ +--------------+
所謂正向代理
,是用於代理客戶端的。舉個很簡單的例子:你直接在大陸地區訪問google.com
肯定是訪問不了的,原因大家都知道,現在假如你有一臺在美國的主機A,並且能夠正常訪問,那麼你可以將瀏覽器對google.com
的請求先轉發給服務器A,服務器A收到請求後,扮演客戶端的角色,發起對google.com
的請求,服務器A收到響應後,又扮演服務端,將此響應原封不動的返回給你,自此,一次正向代理順利完成。
反向代理
顧名思義是用來代理服務端的。我們也舉個簡單的例子來說明:我們知道google.com
沒秒鐘要處理如洪水般的網絡請求,這些請求如果僅僅讓一臺單一的服務器處理,肯定是處理不過來的,我們自然而然的想到讓多臺服務器來處理這些請求,減少每臺服務器的壓力。但是現在有一個問題,多個服務器那就產生了多個IP,一般的,google.com
只能解析到某個固定的IP(爲了方便描述,我們暫且這樣認爲。實際情況下,通過設置也是可以讓同一個域名解析到多個IP的),因爲現在存在多個Server,我的一個google.com
就不能解析到這些服務器上,而且用多個二級域名比如server1.google.com
,server2.google.com
等等也給用戶造成了使用上的不便(一萬臺服務器,你咋不上天呢?),那該怎麼辦呢?通過反向代理可以很好的解決這個問題。爲此,我繪製了下面的示意圖:
+-------------------+ | | +------> server 1 | +-------------+ | | | | +----------+ | | | | client 1 | | | +-------------------+ | | | | +-------------+ | | | +------------------+ | +-------------------+ | | | | | | +-------------+ | | | | | server 2 | | | | | +------------> | | clent 2 +--------------------> reverse proxy | | | | | | | | | | +-------------------+ +-------------+ | | | | | | | | . . | | | | . . | +------------------+ | . . | | | | +--------------------+ +-------------+ | | | | | | | | | server m | | client n +----------+ +------> | | | | | +-------------+ +--------------------+
而本文的豬腳——Nginx就是幹這個事的。
配置反向代理
-
我們利用 http-server 啓動一個本地server。
1http-server -p 3000然後在所在的文件夾裏新建一個
index.html
,輸入hello, nginx
。 -
配置host文件
以Linux
爲例:1sudo vim /etc/hosts然後在裏面添加一條記錄:
1test.com 127.0.0.1 -
配置nginx.conf
在http
裏面添加:12345678910111213141516171819202122232425262728293031#本地http-server開啓的server,命名爲node-server,監聽3000端口upstream node-server{server 127.0.0.1:3000;}# NGINX 虛擬主機,監聽80端口server {listen 80;server_name test.com;access_log /var/log/nginx/node-server;# Gzip Compressiongzip on;gzip_comp_level 6;gzip_vary on;gzip_min_length 1000;gzip_proxied any;gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;gzip_buffers 16 8k;# 反向代理 node-serverlocation / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;proxy_set_header X-NginX-Proxy true;# 代理的地址proxy_pass http://node-server;proxy_redirect off;}} -
啓動
Nginx
以Linux
爲例:1sudo service nginx start
5.測試
可以看到,對於用戶的請求,我們成功反向代理到127.0.0.1:3000
上!
負載均衡
負載均衡
,這個名稱聽起來刁刁的有木有!其實嘛,也就那回事,不要被這牛逼哄哄的名詞嚇住了。之前我們分析了google.com
是怎麼對請求進行分流的,現在我們就來小小的試驗一下。
-
另開啓一個本地server
1http-server -p 3001在此server的根目錄下新建
index.html
,輸入’hello, nginx (server 2)’ -
配置nginx.conf
修改之前的配置爲:123456789101112131415161718192021222324252627282930313233#本地http-server開啓的server,命名爲node-server,監聽3000和3001端口upstream node-server{# weight表示權重,數值越大,表示被分配到這個server的機率越大,這裏我們讓其相等。server 127.0.0.1:3000 weight=1;server 127.0.0.1:3001 weight=1;}# NGINX 虛擬主機,監聽80端口server {listen 80;server_name test.com;access_log /var/log/nginx/node-server;# Gzip Compressiongzip on;gzip_comp_level 6;gzip_vary on;gzip_min_length 1000;gzip_proxied any;gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;gzip_buffers 16 8k;# 反向代理 node-serverlocation / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;proxy_set_header X-NginX-Proxy true;# 代理的地址proxy_pass http://node-server;proxy_redirect off;}} -
重啓Nginx
以Linux
爲例:1sudo nginx -s reload或者
1sudo service nginx restart