目錄
- 一、簡介
- 二、環境準備
- 2.1、下載
- 2.2、Nginx目錄
- 2.3、常用命令
- 三、配置
- 3.1、配置nginx.conf
- 3.2、自定義配置localhost_80.conf
- 3.3、自定義負載均衡配置upstream.conf
- 四、測驗及運行結果
- 4.1 測驗專案
- 4.2 在idea運行多實體服務
- 4.3 正常請求
- 4.4 其他測驗
- 4.5 靜態資源請求
一、簡介
??Nginx(engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務,Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行,其特點是占有記憶體少,并發能力強,事實上Nginx的并發能力在同型別的網頁服務器中表現較好,許多的大廠都在用,
??今天我們就來講一下windows下Nginx的安裝配置及簡單負載均衡的使用,
二、環境準備
2.1、下載
??Nginx下載地址: http://nginx.org/en/download.html,本文中下載第二個windows的穩定版本,如圖:

2.2、Nginx目錄
??這里我解壓到本地C:\myProgram\Nginx-1.20.1\后的目錄結構如下:

??進入到組態檔目錄C:\myProgram\Nginx-1.20.1\conf,我們新建一個conf.d的目錄,用于存放自定義的組態檔等,

2.3、常用命令
??這里我們列出一些常用的命令,后續可以直接使用:
| 命令 | 含義 |
|---|---|
| nginx -h | 查看幫助資訊 |
| nginx -v 或者 nginx -V | 查看Nginx的版本號,v只是簡單顯示版本資訊,V不但顯示版本資訊,還顯示配置引數資訊 |
| nginx -s reopen | 打開日志檔案 |
| nginx -t | 驗證(nginx.conf)組態檔是否有語法錯誤 |
| nginx -s reload | 組態檔修改重裝載命令 |
| nginx -c 指定組態檔的路徑 | 指定組態檔啟動,默認是conf/nginx.conf |
| start nginx | 啟動Nginx |
| nginx -s quit | 正常停止或關閉Nginx |
| nginx -s stop | 快速停止或關閉Nginx |
注意:
??window版本啟動方式建議是進入到安裝的目錄,比如我這里的C:\myProgram\Nginx-1.20.1\conf,通過cmd命令,先執行nginx -t檢查組態檔是否配置正確,再執行start nginx,如圖:

如果是已經啟動了,修改了組態檔則只需要執行nginx -t,再執行nginx -s reload即可,啟動成功后,訪問下:http://localhost:80或者http://localhost,出現如下圖及表示成功了:

三、配置
??之前我們看過目錄結構,一般nginx.conf類上于全域的配置,我們可以在自定義的目錄conf.d創建我們的組態檔,一般按照域名加埠的方式命名,如localhost_80、localhost_443等,負載均衡的都放到upstream.conf,當然你也可以不同方式命名,
,對于nginx配置最好分類,如果配置多了就很難維護了,
3.1、配置nginx.conf
#Nginx的全域配置,也就是main,包含Events和HTTP
#指定Nginx Worker行程運行用戶以及用戶組,默認由nobody賬號運行(windows會有警告資訊)
#user nobody nobody;
#指定了Nginx要開啟的行程數,每個Nginx行程平均耗費10M~12M記憶體
worker_processes 2;
#定義全域錯誤日志檔案,一定要設定warn級別以上,日志輸出級別有:[debug|info|notice|warn|error|crit]
error_log logs/error.log notice;
#指定行程pid的存盤檔案位置
pid logs/nginx.pid;
#Nginxworker最大打開檔案數
worker_rlimit_nofile 65535;
#events事件指令是設定Nginx的作業模式及連接數上限
events{
#指定Nginx的作業模式,Nginx支持的作業模式有select、poll、kqueue、epoll、rtsig和/dev/poll
#use epoll;
#單個行程最大連接數(最大連接數=連接數*行程數)
worker_connections 65536;
}
#設定http服務器
http{
#實作對組態檔所包含的檔案的設定
include mime.types;
#默認檔案型別:二進制流
default_type application/octet-stream;
#服務域名的最大hash表大小
server_names_hash_max_size 512;
#服務域名的hash表大小
server_names_hash_bucket_size 128;
#指定Nginx日志的輸出格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent $request_body "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"responsetime":$request_time'
'-"$upstream_cache_status"'
' Alian $http_[W-Os] $http_[W-Brand] $http_[W-Model] $http_[W-IMEI] $http_[W-App-Version] $http_[W-Token] $http_[W-Partner-Id] $http_[W-Operator-Id] $http_[W-Window-Id]';
log_format logstash '{"@timestamp":"$time_iso8601",'
'"slbip":"$remote_addr",'
'"clientip":"$http_x_forwarded_for",'
'"serverip":"$server_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"domain":"$host",'
'"method":"$request_method",'
'"requesturi":"$request_uri",'
'"url":"$uri",'
'"appversion":"$HTTP_APP_VERSION",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status",'
'"W-Brand":"$http_[W-Brand]",'
'"W-Model":"$http_[w-model]",'
'"W-Token":"$http_[w-token]",'
'"W-Token":"$http_[W-Token]",'
'"devicecode":"$HTTP_HA"}';
#允許客戶端請求的最大的單個檔案位元組數
client_max_body_size 20m;
#指定來自客戶端請求頭的headerbuffer大小
client_header_buffer_size 32K;
#指定客戶端請求中較大的訊息頭的快取最大數量和大小
large_client_header_buffers 4 32k;
#用于開啟高效檔案傳輸模式
sendfile on;
#資料包不會馬上傳送出去,等到資料包最大時,一次性的傳輸出去,從而提高I/O性能,也可以有助于解決網路堵塞,當然會有一點點延遲(使用sendfile函式時,tcp_nopush才起作用,和tcp_nodelay互斥)
tcp_nopush on;
#發送小塊資料時,立即發送資料,回應快,客戶端受益(和tcp_nopush互斥)
tcp_nodelay off;
#設定客戶端連接保持活動的超時時間,單位是秒,超過則關閉連接
keepalive_timeout 60;
#自動創建索引,比如目錄瀏覽下載功能,默認關閉
autoindex off;
#設定客戶端請求頭讀取超時時間
client_header_timeout 10;
#設定客戶端請求主體讀取超時時間,默認值是60
client_body_timeout 30;
#指定回應客戶端的超時時間
send_timeout 30;
#設定Nginx服務器和后端FastCGI服務器連接的超時時間
fastcgi_connect_timeout 60;
#設定Nginx允許FastCGI服務端回傳資料的超時時間
fastcgi_send_timeout 60;
#設定Nginx從FastCGI服務端讀取回應資訊的超時時間
fastcgi_read_timeout 60;
#設定用來讀取從FastCGI服務端收到的第一部分回應資訊的緩沖區大小
fastcgi_buffer_size 64k;
#設定用來讀取從FastCGI服務端收到的回應資訊的緩沖區大小以及緩沖區數量
fastcgi_buffers 4 64k;
#設定系統很忙時可以使用的fastcgi_buffers大小,推薦大小為fastcgi_buffers *2
fastcgi_busy_buffers_size 128k;
#fastcti臨時檔案的大小,可設定128-256K
fastcgi_temp_file_write_size 128k;
#配置Nginx的HttpGzip模塊(是否安裝了HttpGzip模塊,優化網站)
#開啟GZIP壓縮,實時壓縮輸出資料流
#gzip on;
#設定允許壓縮的頁面最小位元組數,默認0,不管頁面多大都進行壓縮,建議大于1K
#gzip_min_length 1k;
#申請4個單位為16K的記憶體作為壓縮結果流快取
#gzip_buffers 4 16k;
#設定識別HTTP協議版本,默認是1.1
#gzip_http_version 1.1;
#指定GZIP壓縮比,1 壓縮比最小,處理速度最快;9 壓縮比最大,傳輸速度快,但處理最慢,也比較消耗cpu資源
#gzip_comp_level 3;
#指定壓縮的型別,無論是否指定,“text/html”型別總是會被壓縮的
#gzip_types text/plain application/x-javascript text/css application/xml;
#讓前端的快取服務器快取經過GZIP壓縮的頁面
#gzip_vary on;
#包含子組態檔,此處是包含conf.d目錄下所有的.conf檔案
include conf.d/*.conf;
include fastcgi.conf;
}
3.2、自定義配置localhost_80.conf
server{
listen 80 ;
#server_name 10.130.3.16;
server_name localhost;
charset utf-8;
add_header X-Cache $upstream_cache_status;
#站點根目錄(自定義的,不一定是這個)
root html;
location / {
root html;
index index.html index.htm;
}
location ~ ^/NLB/ {
proxy_redirect off;
#埠
proxy_set_header Host $host;
#遠程地址
proxy_set_header X-Real-IP $remote_addr;
#程式可獲取遠程ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#此處會用的upstream.conf,此檔案在nginx.conf已經引入了
proxy_pass http://load-balance;
}
#所有靜態檔案由nginx直接讀取不經過tomcat或resin($和{中間有一個空格)
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
expires 30d;
}
#($和{中間有一個空格)
location ~ .*.(js|css)?$ {
expires 15d;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ ^.*\.svn\/{
deny all;
}
#設定查看Nginx狀態的地址
location /NginxStatus {
stub_status off;
access_log logs/NginxStatus.log;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd檔案的內容可以用apache提供的htpasswd工具來產生,
}
#可以絕對路徑,如果是相對路徑就是相對執行啟動的目錄(nginx.exe)
access_log logs/localhost_access.log;
}
3.3、自定義負載均衡配置upstream.conf
upstream load-balance {
#預留的備份機器,當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器
server 127.0.0.1:8082 backup;
#當前的server暫時不參與負載均衡
server 127.0.0.1:8083 down;
server 127.0.0.1:8084;
server 127.0.0.1:8085;
}
事實上我們還可以配置權重資訊weight,值越大輪詢到的可能性就更大,max_fails允許請求失敗的次數,默認為1,fail_timeout在經歷了max_fails次失敗后,暫停服務的時間,兩者一般一起使用,如下:
upstream load-balance {
#預留的備份機器,當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器
server 127.0.0.1:8082 backup;
#當前的server暫時不參與負載均衡
server 127.0.0.1:8083 down;
server 127.0.0.1:8084 weight=10;
server 127.0.0.1:8085 weight=1 max_fails=2 fail_timeout=30s;
}
四、測驗及運行結果
4.1 測驗專案
application.yml
server:
port: 8082
servlet:
context-path: /NLB
package com.alian.loadbalance.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LoadBalanceController {
@Value("${server.port}")
private int serverPort;
@RequestMapping("loadBalance")
public String loadBalance(){
log.info("服務【{}】的處理回傳",serverPort);
return "服務埠:"+serverPort;
}
}
4.2 在idea運行多實體服務
如果要使應用高可用,就需要服務部署多個,這里以idea為例,看本機怎么測驗,因為組態檔里我們埠是8082,我們的應用只要埠不一樣即可,所以我們每次啟動的時候就更改埠,我這里啟動的4個,具體說明如下:
| 服務NLB埠 | 說明 |
|---|---|
| 8082 | 熱備份 |
| 8083 | 下線狀態 |
| 8084 | 正常運行 |
| 8085 | 正常運行 |
通過idea運行旁邊的Edit configurations右上角勾上Allow parallel run,記得每次都要更改埠,再運行哦,具體啟動如下圖:

4.3 正常請求
連續請求兩次:http://localhost/NLB/loadBalance得到結果:


不管兩次還是多次,結果都是輪詢回傳的,這是基于nginx默認的輪詢規則,
4.4 其他測驗
關閉端為8084和8085的實體,再次請求http://localhost/NLB/loadBalance,發現我們的熱備服務器起作用了,得到結果為:

4.5 靜態資源請求
我們在C:\myProgram\Nginx-1.20.1\html下放一個圖片AlianBlog.png,因為localhost_80.conf已經配置了根目錄就是html,所有我們直接請求http://localhost/AlianBlog.png,結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/319683.html
標籤:其他
