這是我參與更文挑戰的第26天,活動詳情查看: 更文挑戰php
中大型項目都會考慮到分佈式,前面幾篇文章着重介紹了數據處理的技術集羣。今天來研究一下關於服務器的負載均衡--Nginx。他除了靜態資源的處理外還有能夠決定將請求置於那臺服務上。html
點我下載nginx
友情提醒:nginx的路徑不能有漢字 web
nginx
複製代碼
nginx -s stop
複製代碼
重啓: nginx.exe -s reload 關閉:nginx.exe -s stop 檢測配置合法性:nginx.exe -tspring
友情提醒:儘可能在重啓的時候用重啓命令。有的人喜歡先關閉服務在開啓服務。這樣作若是修改後的配置是錯誤的,就會影響到nginx的使用。而若是用重啓命令,就算修改後的配置錯誤了,僅僅影響新修改的功能,以前的服務仍然能夠執行。windows
首先貼出一段官網的windows的配置文件。下面逐條解釋。瀏覽器
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
複製代碼
#user nobody;
: user屬性在windows中不用設置,人家註釋寫的很清楚 nobody,可是在Linux系統中咱們建議寫 user nginx(用戶) nginx(組) 。服務器
worker_processes 1;
: 工做進程 正常是CPU*2markdown
error_log
: nginx 的錯誤日誌記錄的文件地址網絡
pid
: 在windows中每一個進程在後臺都是有一個pid的。
events
: 裏面設置一些屬性好比鏈接數 worker_connections
http
: http就是nginx經過設置的http實現負載均衡的
- `include mime.types;` : 設定mime類型,類型由mime.type文件定義
- `default_type application/octet-stream;` : 設置默認的請求類型
- `log_format` : 日誌的輸出格式。
- 日誌格式參數解釋:
- `$remote_addr`與`$http_x_forwarded_for`用以記錄客戶端的ip地址;
- $remote_user:用來記錄客戶端用戶名稱;
- $time_local: 用來記錄訪問時間與時區;
- $request: 用來記錄請求的url與http協議;
- $status: 用來記錄請求狀態;成功是200,
- $body_bytes_sent :記錄發送給客戶端文件主體內容大小;
- $http_referer:用來記錄從那個頁面連接訪問過來的;
- $http_user_agent:記錄客戶瀏覽器的相關信息;
- `sendfile on;` : sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設爲on。若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡IO處理速度,下降系統uptime。
複製代碼
- `tcp_nopush on;`: 此選項容許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
複製代碼
upstream mynginxserver {
server 192.168.1.183:8888 weight=2;
server 192.168.1.183:8080 weight=1;
}
複製代碼
其中weight是權重,就是nginx在隨機選擇的時候回根據這個權重去選擇服務。
而後咱們將location的映射路徑映射到mynginserver上就好了。
location / {
proxy_pass http://mynginxserver;
}
複製代碼
注意: proxy_pass 後必須以http://開頭。
注意看路徑的端口是不一樣的 Tomcat1:
Tomcat2:
而後咱們這個時候在訪問nginx的端口:http://192.168.1.183:802/springtests/
上面咱們已經實現了負載均衡。nginx給我提供了關於負載均衡的策略。
默認策略--輪詢:
upstream mynginxserver {
server 192.168.1.183:8888;
server 192.168.1.183:8080;
}
複製代碼
經過請求的時間順序請求不一樣的Tomcat。若是某一個宕機了,則自動忽略。
upstream mynginxserver {
least_conn;
server 192.168.1.183:8888;
server 192.168.1.183:8080;
}
複製代碼
upstream mynginxserver {
server 192.168.1.183:8888 weight=2;
server 192.168.1.183:8080 weight=1;
}
複製代碼
upstream mynginxserver {
ip_hash;
server 192.168.1.183:8888 ;
server 192.168.1.183:8080 ;
}
複製代碼
upstream mynginxserver {
hash $request_url;
server 192.168.1.183:8888;
server 192.168.1.183:8080;
}
複製代碼
upstream mynginxserver {
server 192.168.1.183:8888 ;
server 192.168.1.183:8080 ;
fair;
}
複製代碼
nginx除了做爲服務器的負載均衡外,還有一個亮點就是地址映射。做爲資源服務器來使用。在咱們的web開發中常常須要上傳資源到服務上。咱們總不能將資源放在Tomcat上。這樣會大大增長Tomcat的壓力的。並且這樣數據很容易丟失的。nginx就能夠解決這個問題。
其實在上面實現負載均衡的時候就已經實現了地址映射。location就是地址映射的橋樑。
location ~ ^/images/(.*)
# location ~ ^/images/(.*\.jpg)
#「.」表示任何字符,「*」表示任意數量,
#「\.jpg」表示jpg後綴名的文件
{
expires 1s;
alias D:/zxh/test/$1; #「$1」表是location後面()的內容
index index.html index.htm;
break;
}
複製代碼
上面的location表示在經過server+port+^images^.^的形式就會映射到D:/zxh/test這個文件夾下。 好比我在瀏覽器中訪問:http://192.168.1.183:802/images/test.jpg
這個時候nginx就會去訪問D:/zxh/test下時候有test.jpg的圖片。