轉載自:https://blog.csdn.net/dutsoft/article/details/55003116
Nginx簡介
Nginx是一個輕量級的、高性能的WebServer,主要可以幹下面兩件事:作爲http服務器(和apache的功能一樣);作爲反向代理服務器實現負載均衡。
安裝Nginx
Mac上執行:
brew install nginx
- 1
Ubuntu上執行:
sudo apt-get install nginx
- 1
Nginx基本操作
1) 啓動Nginx:start nginx
2) 停止Nginx:nginx -s stop
3) 修改配置後重啓:nginx -s reload
- 1
- 2
- 3
關於代理
正向代理
正向代理,作爲一個媒介將互聯網上獲取的資源返回給相關聯的客戶端。代理和客戶端在一個局域網,對於服務端是透明的
反向代理
反向代理,根據客戶端的請求,從後端的服務器上獲取資源,然後再將這些資源返回給客戶端。代理和服務器在一個局域網,對客戶端是透明的。
反向代理的作用
- 提高動態語言的I/O處理能力,Python、PHP、Java這樣的動態服務的I/O處理能力不高,反向代理可以緩衝請求,交給後端一個完整的HTTP請求,同樣,Nginx也可以緩衝響應,也達到了減輕後端的壓力。
- 加密和SSL加速。
- 安全。它保護和隱藏了原始資源服務器,還可以用作應用防火牆防禦一些網絡攻擊,比如DDoS。
- 負載均衡。它幫應用服務器分配請求,以達到資源使用率最佳、吞吐率最大、響應時間最小的目的。
- 緩存靜態內容。代理緩存通常可以滿足相當數量的網站請求,大大降低應用服務器上的負載。
- 支持壓縮。通過壓縮優化可以提高網站訪問速度,還能大大減少帶寬的消耗。
在生產環境中,通常會在多個服務器啓動多個tornado進程實例,使用Nginx在前端作爲反向代理服務器來分發web請求,同時負載均衡。
反向代理實例
tornado服務的demo
# coding: utf-8
import tornado.ioloop
import tornado.web
from multiprocessing import Pool
import sys
import os
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world! PID: %s" % os.getpid())
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
def run(port):
print 'Start Process on port: %s' % port
sys.stdout.flush()
application.listen(port)
tornado.ioloop.IOLoop.instance().start()
pool = Pool(3)
pool.map(run, [8001, 8002, 8003])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
tornado會啓動三個進程,分別偵聽8001, 8002, 8003三個端口。
調整Nginx配置
負載均衡的目的是爲了解決單個節點壓力過大,造成Web服務響應過慢,嚴重的情況下導致服務癱瘓,無法正常提供服務的問題。
Nginx負載均衡是通過upstream模塊來實現的,內置實現了多種負載策略。Mac上Nginx的配置文件位於/usr/local/etc/nginx
,用vim打開進行編輯。
負載均衡配置
upstream tornado.server {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
- 1
- 2
- 3
- 4
- 5
upstream指令主要用於負載均衡,設置一系列的後端服務器。nginx 的 upstream默認是以輪詢的方式實現負載均衡,這種方式中,每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。此外還有ip_hash、weight、url_hash、fair等負載均衡策略。
upstream命名和服務器地址根據實際情況修改。我這裏是本地起的三個tornado服務,所以server IP地址都配的是127.0.0.1,默認輪詢的負載均衡。
反向代理配置
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://tornado.server;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
location部分用於匹配反向代理的網頁位置。反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。
完整配置示例
worker_processes 1;
events {
worker_connections 1024;
use kqueue;
}
http {
include mime.types;
default_type application/octet-stream;
# 負載均衡配置
upstream tornado.server {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 反向代理配置
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://tornado.server;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
代理地址根據實際情況修改,其他缺省配置項採用默認值就可以。
重新加載nginx.conf
如果已經啓動了Nginx,執行sudo nginx -s reload
重新加載配置。
訪問結果
直接在瀏覽器中訪問http://127.0.0.1/
,就可以訪問demo應用了。每次刷新都返回了Hello, world! PID:18854
,後面跟的pid是交替出現,說明負載均衡生效了。
附錄: Windows下Nginx的啓動、停止等命令
在Windows下使用Nginx,我們需要掌握一些基本的操作命令,比如:啓動、停止Nginx服務,重新載入Nginx等,下面我就進行一些簡單的介紹。
1、啓動:
C:\server\nginx-1.0.2>start nginx
或
C:\server\nginx-1.0.2>nginx.exe
注:建議使用第一種,第二種會使你的cmd窗口一直處於執行中,不能進行其他命令操作。
2、停止:
C:\server\nginx-1.0.2>nginx.exe -s stop
或
C:\server\nginx-1.0.2>nginx.exe -s quit
注:stop是快速停止nginx,可能並不保存相關信息;quit是完整有序的停止nginx,並保存相關信息。
3、重新載入Nginx:
C:\server\nginx-1.0.2>nginx.exe -s reload
當配置信息修改,需要重新載入這些配置時使用此命令。
4、重新打開日誌文件:
C:\server\nginx-1.0.2>nginx.exe -s reopen
5、查看Nginx版本:
C:\server\nginx-1.0.2>nginx -v