介紹:業務從發展的初期到逐漸成熟,服務器架構也是從相對單一到集羣,再到分佈式,技術迭代的速度很是快,致使咱們不斷的學習。。。
一個能夠支持高併發的服務少不了好的服務器架構,須要有負載均衡,主從集羣的數據庫,主從集羣的緩存,靜態文件上傳cdn,好比 七牛雲 等,這些都是讓業務程序流暢運行的強大後盾。html
閒話很少說,下面簡單介紹搭建Windows服務器架構。mysql
介紹:Nginx是 Igor Sysoev 爲俄羅斯訪問量第二 Rambler.ru 站點開發的一款高性能HTTP和反向代理服務器。nginx
那麼有些人不明白反向代理與正向代理有什麼不一樣?redis
正向代理就像是 由於GWF,國內須要使用代理訪問Google,可是Google不知道真實的客戶端是誰,代理隱藏了真實的客戶端請求,客戶端請求的服務都被代理服務器代替。sql
www.baidu.com 是咱們的反向代理服務器,反向代理服務器會幫咱們把請求轉發到真實的服務器那裏去。
數據庫
1:從新加載配置 2:關閉 3:開啓(或者nginx -c conf/nginx.conf
)segmentfault
附錄:Nginx工做原理windows
修改\Tomcat\conf\server.xml (三個端口)& \nginx-1.11.6\conf\nginx.conf :緩存
#user nobody;#用戶名 worker_processes 1;#工做進程(與CPU個數一比一) #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;#單個進程最大鏈接數(worker_processes*worker_connections/4小於系統進程打開的文件總數) } http { upstream tomcat { #反向代理 server localhost:8082 weight=2;#weight權重(機器性能好weight就設大些) server localhost:8083 weight=3; } 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"';#轉發真實ip #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80;#默認80端口 server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / {#配置靜態文件等 root html; index index.html index.htm; proxy_pass http://tomcat;#反向代理(上面upstream tomcat) } #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; } } }
如何知道集羣服務器配置好了呢?tomcat
咱們修改項目頁面,將body內容改成aaa...和bbb...,打包分別放到上面的Tomcat中,從新啓動Tomcat和Nginx。
根據上圖,Nginx會將請求分發到不一樣的Tomcat中。
介紹:Nginx是採用master-worker多進程的方式,master負責請求轉發,worker的數量爲CPU數,全部worker進程的listenfd會在新鏈接到來時變得可讀,爲保證只有一個進程處理該鏈接,全部worker進程在註冊listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個進程註冊listenfd讀事件,在讀事件裏調用accept接受該鏈接。
使用 NGINX 流控和 fail2ban 防止 CC 攻擊
在http模塊中添加
limit_req_zone $binary_remote_addr zone=sym:10m rate=5r/s; #限制發起的請求頻率,每秒5次 limit_conn_zone $binary_remote_addr zone=conn_sym:10m; #限制發起的鏈接數
在location中添加
limit_req zone=sym burst=5; limit_conn conn_sym 10;
配置好後Nginx重啓。模擬多線程併發請求,結果顯示成功和異常:
查詢Nginx/conf/error.log,顯示以下:
解壓redis(主)再複製三份,文件夾名稱分別改成redis-slave(從)、redis-slave2(從)、redis-sentinel(哨兵)這些文件夾都能複製屢次
(*.conf文件的名字可能不一樣!sentinel.conf須要新建!)
修改redis(主)文件夾下的redis.windows.conf:
port 6380 #端口(不能重複) logfile "E:/redis.log" #日誌(防止宕機後可查) slave-read-only no #默認爲yes,改成no用於主從複製 requirepass "XXX" #密碼(主從密碼需相同)
修改redis-slave(從)下的redis.windows.conf:
port 6381 logfile "E:/redis_slave1.log" slaveof 127.0.0.1 6380 #master slave-read-only no masterauth "XXX" #主密碼 requirepass "XXX"
在redis-sentinel(哨兵)下建立sentinel.conf文件,內容爲:
port 26379 sentinel monitor mymaster 127.0.0.1 6380 1 #主配置,數字1表明有1個Sentinel監聽有問題就進行主從複製並切換 sentinel down-after-milliseconds mymaster 6000 sentinel failover-timeout mymaster 900000 sentinel auth-pass mymaster Alex #密碼
下面爲演示:
(1)運行主從Redis:
(2)運行Sentinel:
介紹:監聽Redis的哨兵,具體看附錄
附錄:Sentinel
運行Sentinel後,.conf中配置內容就會刷新成:
爲防止Sentinel宕掉。可複製多份sentinel並修改端口,分別啓動。
(3)檢測主從切換
當master宕機後,防止整個資源掛掉,將採用Sentinel實時監控Redis,狀況發生後會當即主從複製並切換,這樣系統崩潰的機率大大下降。
監聽的主端口變爲6381,非以前的6380,子監聽的主也自動切換了。
(1)在Master MySQL上建立用戶,容許其餘Slave服務器能夠經過遠程訪問Master,經過該用戶讀取二進制日誌,實現數據同步。
建立的用戶必須具備REPLICATION SLAVE權限,除此以外不必添加沒必要要的權限,密碼爲'XXX'。192.168.94.%是指明用戶所在服務器,%是通配符,表示192.168.94.0/255的Server均可以登錄主服務器。
(2)修改my.Ini文件。啓動二進制日誌log-bin。
在[mysqld]下面增長:
server-id=1 #給數據庫服務的惟一標識,通常爲你們設置服務器Ip的末尾號 log-bin=master-bin log-bin-index=master-bin.index
(3)重啓Mysql服務,查看日誌
(1)修改my.ini文件,在[mysqld]下面增長
log_bin = mysql-bin server_id = 2 relay_log = mysql-relay-bin log_slave_updates = 1 read_only = 1
重啓Mysql
(2)鏈接Master
change master to master_host='192.168.XXX.XXX', master_port=3306, master_user='alexnevsky', master_password='XXXX', master_log_file='master-bin.000001', master_log_pos=0;
(3)啓動Slave
start slave;