Nginx
Nginx作爲一款反向代理服務器,現在大多數網站都有使用,自己在項目中幾乎都有用到,自己的網站也使用到了它。
瞭解Nginx
上面圖可以直觀的看出Nginx的用處,可以將請求轉發至Web服務器和文件服務器,當然還可以轉發其他的內容,比如Rest接口,TCP端口等等。
使用Nginx
Nginx安裝成功後,大部分內容都是配置在nginx.conf文件中。
負載均衡
如果是在同一臺服務器上運行了多個Web服務,需要做負載均衡,首先只需要在nginx.conf中配置 upstream
參數,設置好所有的服務請求路徑,爲這些服務配置好權重以及其他連接參數。
upstream tuling {
server 127.0.0.1:8050 weight=1 max_fails=1 fail_timeout=20;
server 127.0.0.1:8060 weight=1;
}
這樣就可以通過 server
參數來監聽指定端口,通過 location
來轉發到設置好的負載均衡服務上。
設置HTTPS
Nginx設置HTTPS十分簡單,HTTPS端口一般爲443端口,我們只需要監聽443,配置好HTTPS證書,重啓Nginx服務後立刻就會生效。
server {
listen 443;
server_name yanzhenyidai.com;
ssl on;
ssl_certificate /usr/local/nginx/cert/www.yanzhenyidai.com.pem;
ssl_certificate_key /usr/local/nginx/cert/www.yanzhenyidai.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
#proxy_pass http://localhost:4000;
proxy_pass http://localhost:3000;
client_max_body_size 3000m;
proxy_http_version 1.1;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
而對外開放的80端口,通常是使用 rewrite
轉發到監聽的443端口,這樣無論怎麼請求都是走的HTTPS。
Nginx監聽指定域名
Nginx也可以做到監聽指定的域名,通過配置 server_name
來處理。
需要注意到的是,如果配置文件中沒有進行server_name的配置,但是有域名解析到了服務器,這個時候Nginx會將該域名轉發到配置中的第一個server上。
類似情況也會有惡意解析域名到服務器的事情發生,比如有人知道你的服務器IP,將自己的域名直接解析到你的服務器,這樣收割流量,解決方案比較也同樣比較噁心,只需要在第一個server下的localtion中轉發到一個靜態頁面提示就可以了。
server {
listen 80;
server_name *.com;
location / {
index error.html;
}
}
Nginx的location轉發配置
這裏還要着重說明 location
參數,畢竟Nginx是一款反向代理服務器,看家本事都在location上面。
Location區段匹配示例
location = / {
# 只匹配 / 的查詢.
[ configuration A ]
}
location / {
# 匹配任何以 / 開始的查詢,但是正則表達式與一些較長的字符串將被首先匹配。
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 開始的查詢並且停止搜索,不檢查正則表達式。
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何以gif, jpg, or jpeg結尾的文件,但是所有 /images/ 目錄的請求將在Configuration C中處
理。
[ configuration D ]
}
各請求的處理如下例:
■/ → configuration A
■/documents/document.html → configuration B
■/images/1.gif → configuration C
■/documents/1.jpg → configuration D
切記如果配置第三種轉發一定要帶 / 結尾,畢竟是喫過虧的人。😂
遇到過的問題
如果有服務請求轉發超過60s的,需要自己在location下增加 proxy_send_timeout
的時間。
如果是客戶端請求到Nginx的響應時間過長,則需要設置http下的 client_body_timeout
的時間。
如果是服務端Nginx返回給客戶端響應時間過長,則要設置 send_timeout
的時間。
總結
Nginx開源後淘寶將Nginx進行了優化,項目名稱Tengine,總而言之,Nginx真的是一款很棒的服務器,