Nginx 常用配置問題整合
- 前言
- 安裝
- 配置server
- 負載均衡
- server 配置
- location 配置
- vue 等單頁面路由專案配置
- 后端服務介面轉發
- WebSocket 轉發
- 靜態資源映射配置
- https 配置
- 配置http 協議自動上升跳轉https 協議請求
前言
系統環境:Centos8.0+
Nginx 版本:1.20 (本篇文章無新特性,理論支持所有版本,可自行測驗)
安裝
以Centos8.0+ 為例,可直接使用dnf -y install nginx 安裝nginx 服務,
默認使用systemctl 命令管理nginx 服務打開關閉,
官網也提供了很多的方式進行安裝,如windows 系統可直接下載后執行,linux 類系統可能需要執行make 命令進行安裝,具體安裝方式可自行查閱,
----官網下載地址
命令串列:
systemctl 為Centos 系統中的服務管理工具,其他系統另行處理
指定組態檔啟動:nginx -c /**/nginx.conf
服務啟動:systemctl start nginx 或nginx
服務重啟:systemctl restart nginx 或nginx -s reload
配置檢查:nginx -t
服務停止:systemctl stop nginx 或直接使用ps 命令查找行程pid 然后kill 掉,
配置server
配置一覽
# 負載均衡
upstream my-service {
server 127.0.0.1:12000;
server 127.0.0.1:13000;
}
# http 配置
server
{
# 監聽埠號
listen 80;
# 監聽域名
server_name domain.com domain2.com;
# 位元組編碼
charset utf-8;
# 日志輸出
access_log /var/log/nginx_access.log;
# 意為request body 中的最大資料量可以傳輸多少
# 如果超過此大小會直接駁回請求回傳錯誤代碼
client_max_body_size 100M;
# gzip 配置
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
# 宣告我要開啟gzip 的資源請求,這邊配置了js 檔案與 css 檔案的gzip 壓縮
gzip_types application/javascript text/css;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
# 配置local 資訊
location /
{
add_header Cache-Control no-store;
try_files $uri $uri/ /index.html;
root /home/www/;
index index.html;
}
# 配置后端api 轉發
location /api
{
proxy_pass http://my-service/api;
proxy_set_header X-Address $remote_addr;
proxy_set_header Host $http_host;
}
# websocket 配置
location /so
{
proxy_pass http://127.0.0.1:15000/so;
proxy_read_timeout 4h;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 靜態資源映射
location ^~ /resource/
{
alias /data/resource/;
autoindex on;
}
}
# https 配置
server
{
listen 443 ssl;
server_name domain.com domain2.com;
charset utf-8;
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
ssl_certificate /**/server.crt;
ssl_certificate_key /**/server.key;
location /api
{
proxy_pass http://my-service/api;
}
}
負載均衡
upstream my-service {
server 127.0.0.1:12000;
server 127.0.0.1:13000;
}
該配置意為配置兩個服務,然后通過輪詢的方式進行負載均衡轉發訪問,
對于upstream 命令,還有一下幾種模式
- 輪詢
輪詢是upstream的默認分配方式,即每個請求按照時間順序輪流分配到不同的后端服務器,如果某個后端服務器down掉后,能自動剔除,upstream my-service { server 127.0.0.1:12000; server 127.0.0.1:13000; } - 權重
增加權重意指代訪問的服務權重比,權重值高轉發的次數就會越多upstream my-service { server 127.0.0.1:12000 weight=1; server 127.0.0.1:13000 weight=2; } - ip_hash
每個請求按照訪問ip(即Nginx的前置服務器或者客戶端IP)的hash結果分配,這樣每個訪客會固定訪問一個后端服務器,可以解決session一致問題,upstream my-service { ip_hash; server 127.0.0.1:12000; server 127.0.0.1:13000; } - fair
轉發的每個請求會按照訪問ip(即Nginx的前置服務器或者客戶端IP)的hash結果分配,這樣每個請求會固定訪問一個后端服務,可以解決session一致性的問題,upstream my-service { server 127.0.0.1:12000; server 127.0.0.1:13000; fair; } - url_hash
與ip_hash類似,但是按照訪問url的hash結果來分配請求,使得每個url定向到同一個后端服務器,主要應用于后端服務器為快取時的場景下,upstream my-service { server 127.0.0.1:12000; server 127.0.0.1:13000; hash $request_uri; hash_method crc32; }其中,hash_method為使用的hash演算法,需要注意的是:此時,server陳述句中不能加weight等引數,
server 配置
大部分來講server 配置中必需包含以下幾種配置
server
{
# 監聽埠號
listen 80;
# 監聽域名
server_name domain.com domain2.com;
location /
{
[other config]
}
}
對于一個server 來講,重要的就是listen 和server_name 引數,他們標注了此部分配置監聽的埠號與監聽的域名,
不同的
server支持監聽同一埠不同域名,當有請求訪問訪問他們相同埠的時候,則會根據域名來區分匹配的server配置進行轉發,
server_name是可以配置多個的,中間用空格隔開
location 配置
vue 等單頁面路由專案配置
# 配置local 資訊
location /
{
add_header Cache-Control no-store;
try_files $uri $uri/ /index.html;
root /home/www/;
index index.html;
}
add_header *** ***:命令的主要作用是為此次request 添加一個指定head 資訊,
Cache-Control為Http 協議中的head,意指此次請求是否快取,no-store為不快取請求內容,try_files:這不是一個很好理解的命令,意圖在于省略rewrite指令來指定此次請求所訪問的一個地址,- 比如此次請求的地址為
http://domain.com/res?userId=1
$uri指令則代表訪問的路徑為/res
$request_uri指令則代表訪問的路徑為/res?userId=1
- 比如此次請求的地址為
當我使用這樣的配置時,訪問http://domain.com 時,就可以跳轉到
/home/www/index.html檔案下,瀏覽器會加載index.html檔案中的js 與css 檔案,當路由模式為history 或hash 模式時,具體的路由跳轉和邏輯處理,都會交給網站的vue router去管理,所以就可以實作單路由頁面跳轉,如果沒有try_files的命令,nginx 會將請求完成的轉發至root命令所配置的檔案目錄下,即當訪問的路徑為
http://domain.com/user/index.html時,
則會轉發到/home/www/user/index.html檔案下,將該檔案回傳,
后端服務介面轉發
# 配置后端api 轉發
location /api
{
proxy_pass http://my-service/api;
proxy_set_header X-Address $remote_addr;
proxy_set_header Host $http_host;
}
該配置意為配置以/api 開頭的請求,通過定義的負載均衡my-service 進行轉發請求,
如果不需要使用負載均衡,也可以直接配置為http://127.0.0.1:12000/api,
proxy_set_header:指令意在設定一個自定義的請求頭,X-Address則是自定義的請求頭,將會添加到此次轉發的header中,$remote_addr是指獲取上一級代理的IP,如有其他獲取ip 的要求可以自行百度處理,
WebSocket 轉發
# websocket 配置
location /so
{
proxy_pass http://127.0.0.1:15000/so;
proxy_read_timeout 4h;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
簡單的說一下比較重點的配置
proxy_read_timeout:配置此次請求鏈接的時間,4h 為四個小時后就會埠,
proxy_http_version:使用websocket 需要將http 設定成1.1 版本,因為默認nginx 的http 協議版本那是1.0,不支持websocket 功能
Upgrade $http_upgrade:保持默認
Connection "upgrade":保持默認
proxy_redirect: 使用websocket 需要關閉代理重定向
靜態資源映射配置
很多時候我們需要將服務器的一個目錄定義為資源目錄,通過nginx 進行請求轉發去訪問,
# 靜態資源映射
location ^~ /resource/
{
alias /data/resource/;
autoindex on;
}
alias:設定一個可訪問的路徑,
autoindex:該命令設定為on 時,會開啟檔案目錄訪問功能,可以直接在web 瀏覽器中顯示出目錄中的所有檔案資訊,
https 配置
server
{
listen 443 ssl;
server_name domain.com domain2.com;
charset utf-8;
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
ssl_certificate /**/server.crt;
ssl_certificate_key /**/server.key;
location /api
{
proxy_pass http://my-service/api;
}
}
對于配置https 來講,與http 協議的區別就是需要配置ssl_certificate與ssl_certificate_key 密鑰證書和密鑰key,
- 這兩個證書檔案是可以自己生成的,也可以使用瀏覽器信任的機構生成的證書,自己生成的ssl 證書是不會被瀏覽器認可的,會有例外的提示,而使用機構申請的證書則會正常顯示,
- 自己可以使用
openssl等工具進行ssl 證書的生成,- 如果瀏覽的鏈接不是需要顯示在瀏覽器頁面中的,是可以使用自己生成的ssl 證書進行https 協議的配置,
配置http 協議自動上升跳轉https 協議請求
對于協議自動上升的問題,可以配置http 請求的rewrite
server {
listen 80;
server_name localhost;(域名)
rewrite ^(.*)$ https://$host$1 permanent;
}
將http 請求重寫到https 的協議上就可以了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352078.html
標籤:其他
上一篇:SSH快速入門
