什麼是nginx?
Nginx是lgor Sysoev爲俄羅斯訪問量第二的rambler.ru站點設計開發的一款應用。從2004年發佈至今,憑藉開源的力量,已經接近成熟與完善。Nginx功能豐富,可作爲HTTP服務器,也可作爲反向代理服務器,郵件服務器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。並且支持很多第三方的模塊擴展。
如果你不明白上邊在說什麼的話也沒關係,你可以把它當成一個工具軟件,接下來我會告訴你它可以做什麼以及怎麼使用。
安裝
既然是個工具,那麼使用時就需要下載。你可以通過下面的鏈接進行下載。下載到本地後可以通過修改conf目錄下的nginx.conf文件對nginx進行配置。
如果你想詳細瞭解nginx的使用命令可以點擊這裏,如果你想快速開始使用可以跳過。
nginx快速使用
啓動: win+r 輸入cmd 回車,cd到nginx的根目錄,輸入命令nginx
停止: 按啓動步驟打開新窗口,輸入命令nginx -s stop 或者打開任務管理器在任務中直接結束nginx的進程。
注意每次修改nginx.conf配置後都需要重啓nginx。
前端代理
在前端開發中做接口調試的時候常常會遇到跨域問題。解決這個問題,在一些比較老或前端依賴比較少的項目中你可能會使用像tomcat這樣的web容器,這種情況前後端不會分離,本地要調試前端代碼一般需要在本地起後臺服務,比較麻煩。隨着node.js的出現和前後端分離開發模式的流行,我們現在出現了webpack,gulp等一系列前端的工程化工具,可以幫助我們解決跨域問題。但是如果你想快速做一個只有幾個頁面的簡單項目,你完全沒必要花時間去學習那些複雜工程化工具的配置,因爲nginx可以很好的幫你解決跨域問題。
實現這個功能其實是利用了nginx的虛擬主機和正向代理,不過你沒必要知道這些概念,看下配置代碼:
http {
upstream localhost-nodes {
server 10.124.96.53:8084; #對應後端服務地址
}
server {
listen 8088; #訪問端口
server_name localhost #nginx服務訪問入口 ,本地開發可設爲 localhost
error_log logs/error.log; #錯誤日誌文件,存放安裝目錄下,可查看請求錯誤信息
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #自定義日誌格式
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main; #日誌文件的路徑及使用的何種日誌格式記錄日誌
location / {
proxy_pass http://localhost-nodes; #localhost-nodes爲自定義代理項目名稱,nginx支持設置多組負載均衡和轉發服務,unstream通過這個名字區分
client_max_body_size 100m; #設置附件上傳大小限制,nginx默認限制是1m
}
location /frontEndPro { # hash匹配名,默認設項目的目錄名
root E:\workspace\myserver\static; #本地靜態資源存放目錄
}
}
}
負載均衡
負載均衡是nginx現在被使用最多的功能,主要是通過對請求的分發處理,減輕對後端服務器的壓力,同時也可以提高響應速度。
http {
upstream myproject {
server 127.0.0.1:8000 weight=3; #配置多臺服務器地址,通過weight設置訪問權重
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80; # 訪問端口
server_name www.domain.com; #nginx服務訪問入口, 線上時爲域名,如果本地開發調試可以設爲 localhost
location / {
proxy_pass http://myproject; #自定義代理項目名稱,nginx支持設置多組負載均衡和轉發服務,unstream通過這個名字區分
}
}
}
防盜鏈
如果自己網站內的一些資源只想被內部或者合作方的網站使用也可以通過nignx配置防盜鏈來實現。防盜鏈可以通過http referer判斷訪問來源,對圖片、視頻、文檔等敏感資源的訪問權限進行限制。使用防盜鏈可以減少寬帶浪費和服務器壓力,對於按流量收費的網站也可以節約成本。值得注意的是referer可以被僞造,如果要提高安全性可以結合http_accesskey_module模塊。
location ~* \.(gif|jpg|png|swf|flv)$ { #如果訪問資源爲gif/jpg/png/swf/flv進行限制
valid_referers none blocked http://192.168.223.156/*; #定義白名單
if ($invalid_referer) { #invalid_referer是內置變量,通過判斷上一行中的valid_referers值會返回0或者1
rewrite ^/www.nginx.cn #如果訪問來源不在白名單內,則進行重定向
#return 404; #也可以直接返回404,通知資源不存在
}
}
反向代理
如果你想在自己項目中嵌入其他項目或者將訪問資源定向到其他服務器,nginx也可以幫你實現,沒錯,nginx反向代理就是這麼黑科技。
server {
listen 8080;
#訪問 8080/wy163/xx 時將請求代理到163網站
location /wy163 { #定義反向代理路由規則
proxy_pass https://163.com; #目標網址
proxy_redirect off;
# 爲請求重新設置請求頭
# 設置被代理端接收到的遠程客戶端IP,如果不設置,則header信息中並不會透傳遠程真實客戶端的IP地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 訪問 8080:/readme.md 從github上獲取相應的文件,減少本地服務器壓力,爲本地服務器節省存儲空間
location /readme.md {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://github.com/yidao620c/scrapy-cookbook/blob/master/README.md;
}
}
正向代理和反向代理的區別?
一句話:正向代理代理客戶端,反向代理代理服務器。