會話保持和動靜分離

前言:

    前兩篇博客說到了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

這樣操作以後, 再來通過瀏覽器訪問頁面, 發現仍然正常. 說明確實可行, 動態資源和靜態資源被分離了.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章