前言:
前兩篇博客說到了keepalived_nginx 和keepalived_tengine,實現discuz的負載均衡和高可用,但是咱們沒有考慮到動態靜態資源分離,和會話保持的問題,實際上每一個部分都應該作爲單獨一臺服務器出現,但是由於還沒有找到工作(有工作請聯繫我Q2137626),自己的機器性能也很有限,所以此處我們在HostDB上新增memcache服務作爲會話保持服務器,用前端HostVS主機作爲靜態資源處理服務器;
前段tengine在接受到客戶端靜態資源請求時,不向後代理,而是自身直接響應。
後端HostDB上搭建memcache作爲會話保持服務器,但是此處我們我們不能使用discuz,因爲它並沒有是使用php自帶的session機制。
HostDB
創建phpwind數據庫和用戶
> create database phpwind; Query OK, 1 row affected (0.00 sec) > grant all on phpwind.* to phpwind@'%' identified by 'magedu'; Query OK, 0 rows affected (0.00 sec) > flush privileges; Query OK, 0 rows affected (0.00 sec)
使用nfs提供phpiwind代碼文件
# mkdir /nfshare/phpwind # unzip /tmp/phpwind_UTF8_8.7.1.zip -d /nfshare/phpwind/
安裝並啓用memcache
# yum install -y memcached # systemctl restart memcached <--在CentOS6中需要/etc/init.d/memcached start 正在啓動 memcached: [確定] [root@34400575 ~]# ss -tnl | grep 11211 LISTEN 0 128 :::11211 :::* LISTEN 0 128 *:11211 *:*
HostRS1
掛在nfs並將discuz修改爲phpwind應用
# mount -t nfs 10.0.0.202:/nfshare /htdocs # chown -R apache:apache /htdocs/phpwind/ # vim /etc/httpd/conf.d/vhosts.conf <VirtualHost *:80> ServerName admin.ws.com DocumentRoot "/htdocs/phpwind/upload/" <Directory "/htdocs/phpwind/upload/"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> </VirtualHost>
給php安裝memcache擴展模塊,並配置php的session存儲在memcache中,隨後重啓httpd服務使其生效
# yum install -y php-memcache # vim /etc/php.ini session.save_handler = memcache session.save_path = "tcp://10.0.0.202:11211?persistent=1&weight=1&timeout=1&retry_interval=15" # vim /etc/httpd/conf.d/php.conf php_value session.save_handler "memcache" php_value session.save_path "tcp://172.18.71.202:11211?persistent=1&weight=1&timeout=1&retry_interval=15" # systemctl restart httpd # ss -tnl | grep 80 LISTEN 0 128 :::80 :::*
使用http://10.0.0.101/install.php,安裝phpwind應用
HostRS2 做相同的配置
測試:
使用admin用戶登錄/退出論壇,重複幾次,然後登陸memcache查看get_hits緩存命中次數
# yum install -y telnet # telnet 10.0.0.202 11211 Trying 10.0.0.202... Connected to 172.18.71.202. Escape character is '^]'. stats STAT pid 2472 STAT uptime 429 STAT time 1463791798 STAT version 1.4.4 STAT pointer_size 64 STAT rusage_user 0.005999 STAT rusage_system 0.016997 STAT curr_connections 12 STAT total_connections 13 STAT connection_structures 13 STAT cmd_get 12 STAT cmd_set 34 STAT cmd_flush 0 STAT get_hits 10 STAT get_misses 2 STAT delete_misses 0 STAT delete_hits 2 STAT incr_misses 3 STAT incr_hits 9 STAT decr_misses 0 STAT decr_hits 0 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 4235 STAT bytes_written 3899 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT bytes 363 STAT curr_items 2 STAT total_items 25 STAT evictions 0 END
動靜分離:
HostVS
# vim /usr/local/nginx/conf/nginx.conf http{ ... # 上游服務器, 即後端RS服務器. upstream backend { server 10.0.0.101 weight=1; server 10.0.0.102 weight=1; # sorry_server server 10.0.0.111:8080 backup; server 10.0.0.112:8080 backup; # 健康檢查 check interval=3000 rise=1 fall=3 timeout=1000 type=http; check_http_send "HEAD / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; } server { listen 80; server_name localhost; charset utf-8; # 當nginx將php代碼送至後端RS處理時請求頭中的Host值會是backend. # php代碼在RS上處理時,其內部代碼會去請求圖片/層疊樣式表等靜態資源以填充頁面. # 而php代碼去請求靜態資源時使用的是如http://backend/xxxx.gif這樣的url,自然是取不到的. # 所以我們要在nginx向後代理遇到Host爲backend時,將其轉換爲127.0.0.1. set $my_host $http_host; if ($http_host = "backend") { set $my_host "127.0.0.1"; } # php頁面請求發往後端RS進行處理 location ~* \.php$ { proxy_pass http://backend; proxy_set_header Host $my_host; } # 其餘內容本機處理 location / { root /htdocs/phpwind/upload; index index.php index.html; } } server { listen 8080; server_name localhost; charset utf-8; root /usr/local/nginx/html; index index.html index.htm; # sorry_server僅提供主頁面, 訪問其它資源也轉至主頁面. location ~ .* { error_page 404 /; } }
Host VS2 做與上面一樣的配置
測試驗證:
將前段HostVS1&&和HostVS2代碼文件中的php文件刪除,而後將後端HostRS1 &&2中的靜態文件刪除,由於我們是通過nfs掛載方式拿到的代碼文件,如果直接刪除,全局都會受到影響。所以我們需要將代碼文件複製到各個節點。
HostVS1 && HostVS2
# cp -r /htdocs/phpwind/ /tmp/ # umount /htdocs/ # cp -r /tmp/phpwind/ /htdocs/ # find /htdocs/phpwind/upload/ -name "*.php" | xargs rm -f
HostRS1 && HostRS2
# cp -r /htdocs/phpwind/ /tmp/ # umount /htdocs/ # cp -r /tmp/phpwind/ /htdocs/ # 當然還有其它靜態資源文件, 這裏爲了測試只需刪除部分即可. # find /htdocs/phpwind/upload/ -name "*.css" -or -name "*.jpg" | xargs rm -f
這樣操作以後, 再來通過瀏覽器訪問頁面, 發現仍然正常. 說明確實可行, 動態資源和靜態資源被分離了.