服務器虛擬化託管方案——Linux篇(第二版)


以前,我寫過一個基於Windows平臺運行VMware Server虛擬機的服務器託管方案。一直在朋友的服務器上運行了4年多。後來慢慢接觸了Linux系統,通過一段時間的學習,發現Linux系統的性能及穩定性比Windows要強不少。因此,我打算將原來的服務器虛擬化方案轉到Linux系統平臺下。javascript

通過近段時間的研究和測試,最後成功的將朋友的服務器遷移到了Linux平臺,使用Linux系統和一些開源軟件使服務器託管利用虛擬化技術和免費開源軟件、系統再次下降成本,同時又提升了系統的性能。php

此方案中實現的功能及特色:css

一、  共享一個公網IP地址,發佈多個虛擬機中的各類服務。html

二、  多個虛擬機中的web站點共享80端口,實現經過域名訪問虛擬機中的站點。java

三、  宿主機上所有使用免費開源的操做系統及軟件,節省軟件費用。node

四、  利用Linux下強大的iptables來保護服務器,相比Windows下的防火牆性能更優秀。nginx

五、  Nginx超強的高併發處理能力、低系統資源開銷,使服務器可以處理更多的併發web訪問請求。web

六、  利用Nginx的反向代理緩存功能,爲Windows虛擬機站點加速。(新加入的一個優化配置)正則表達式

CentOS中配置支持NTFS文件系統格式(宿主機)sql

添加此節內容,是爲一些須要將Windows下的數據導入到Linux平臺的用戶方便。

CentOS系統默認狀況下並不支持掛載ntfs分區,須要咱們單獨安裝ntfs的驅動才能對ntfs分區進行讀寫操做,用uname –r命令查看系統內核版本信息,並下載相應的NTFS驅動。本例中版本是kernel-module-ntfs-2.6.18-128.el5

安裝命令:

 rpm -ivh kernel-module-ntfs-2.6.18-128.el5-2.1.27-0.rr.10.11.i686.rpm

運行/sbin/modprobe ntfs加載內核模塊,檢查是否加載成功。

[root@localhost ~]# dmesg | grep NTFS

NTFS driver 2.1.27 [Flags: R/W MODULE].

若是出現上面的信息,說明已經能夠對ntfs分區進行讀寫操做了。也能夠運行cat /proc/filesystems命令進行查看。

接下來就是將要遷移的磁盤分區掛載到CentOS系統下,而後遷移數據。掛載NTFS分區(/dev/hda6爲原Windows系統下的C盤分區)命令以下:

mount -t ntfs /dev/hda6 /mnt/c

系統配置環境

下表中列出了本方案的各類配置信息:

操做系統

相關軟件

網絡配置

備註

CentOS/Linux(版本自選)此爲宿主機,安裝到物理服務器上

Vmware Server 2.0(用於虛擬化的實現)

Eth0:192.168.10.5/24

Eth1:10.10.5.254 (ip爲實驗環境,實際應用時要修改此IP)

後文對物理主機上的操做系統稱爲宿主機

宿主機的eth0:內網網卡(與虛擬機相連的虛擬網卡vmnet1

宿主機eth1 :外網網卡(此網卡綁定了公網IP地址)

虛擬機系統,對外提供各類服務

虛擬機網卡的鏈接方式選Host-only

CentOS/Linux(版本根據須要可自選)

安裝相關應用程序ApacheFTPMysql

Etho0192.168.10.20/24

網關:192.168.10.5

Windows操做系統

IISFTPMSSqlMail

本地鏈接:192.168.10.10/24

網關:192.168.10.5

其餘虛擬機系統

   

虛擬機和宿主機的拓撲圖以下:

安裝配置Nginx 0.8.35(宿主機)

一、  安裝Nginx所需的pcre:

http://www.pcre.org/去下載最新版

tar zxvf pcre-8.01.tar.gz

cd pcre-8.01/

./configure

make && make install

cd ../

二、  安裝Nginx清理緩存模塊

使用此模塊能夠實現緩存的清理任務

wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz
tar zxvf ngx_cache_purge-1.0.tar.gz

只要將模塊解壓出來便可,在編譯Nginx時同時編譯此模塊。

三、  安裝Nginx

http://www.nginx.org/en/download.html下載最新版

/usr/sbin/groupadd www

/usr/sbin/useradd -g www www

tar zxvf nginx-0.8.35.tar.gz

cd nginx-0.8.35/

./configure --user=www --group=www --add-module=../ngx_cache_purge-1.0 --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module

make && make install

cd ../

四、  修改Nginx全局配置文件

worker_processes  2;

access_log off;

error_log off;

events {

    use epoll;

    worker_connections  65535;

}

  #charset  gb2312;

  server_names_hash_bucket_size 128;

  client_header_buffer_size 32k;

  large_client_header_buffers 4 32k;

  client_max_body_size 8m;

     

  sendfile on;

  tcp_nopush     on;

  keepalive_timeout 60;

  tcp_nodelay on;

fastcgi相關配置能夠刪除不使用,僅作記錄暫不使用.

  fastcgi_connect_timeout 300;

  fastcgi_send_timeout 300;

  fastcgi_read_timeout 300;

  fastcgi_buffer_size 64k;

  fastcgi_buffers 4 64k;

  fastcgi_busy_buffers_size 128k;

  fastcgi_temp_file_write_size 128k;

  gzip on;

  gzip_min_length  1k;

  gzip_buffers     4 16k;

  gzip_http_version 1.0;

  gzip_comp_level 2;

  gzip_types       text/plain application/x-javascript text/css application/xml;

  gzip_vary on;

  #limit_zone  crawler  $binary_remote_addr  10m;

五、  配置開機自動啓動Nginx

修改/etc/rc.local文件,在最後加入以下命令

ulimit -SHn 65535

/usr/local/nginx/sbin/nginx

優化Linux內核參數(宿主機)

修改/etc/sysctl.conf文件,在最後加入如下內容:

net.ipv4.tcp_max_syn_backlog = 65536

net.core.netdev_max_backlog =  32768

net.core.somaxconn = 32768

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 120

net.ipv4.ip_local_port_range = 1024  65535

使配置當即生效:

/sbin/sysctl –p

設置Web站點的域名請求轉發及緩存加速(宿主機)

相對於以前的轉發方法,感受這個方法比較直觀也比較簡單、容易理解。

下面是整個nginx的配置文件內容,裏邊包括了Nginx的反向代理設置和緩存配置方法。

[root@localhost conf]# cat nginx.conf

#user  nobody;

worker_processes  2;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

pid        logs/nginx.pid;

#access_log logs/access.log;

error_log logs/error.log;

events {

    use epoll;

    worker_connections  65535;

}

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"';

    log_format test '$remote_addr - $uri'

    sendfile        on;

    #tcp_nopush     on;

    #keepalive_timeout  0;

    keepalive_timeout  65;

    gzip  on;

    gzip_min_length  1k;

    gzip_buffers     4 16k;

    gzip_http_version 1.0;

    gzip_comp_level 2;

    gzip_types       text/plain application/x-javascript text/css application/xml;

    gzip_vary on;

    proxy_temp_path   /var/proxy_temp_dir;

    proxy_cache_path  /var/proxy_cache_dir  levels=1:2   keys_zone=cache_one:300m inactive=1d max_size=5g;

    proxy_cache_valid  200 304 12h;

    add_header X-Cache Nginx-X;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_cache_key $host$uri$is_args$args;

  server

  {

    listen       80;

server_name  www1.duxt.net www2.duxt.net;

access_log off;

    #limit_conn   crawler  20;

    location / {

       proxy_cache cache_one;

       proxy_pass http://192.168.10.10:80;

    }

    location ~ /p(/.*)

    {

     allow            127.0.0.1;

     allow            10.10.5.0/24;

     deny            all;

     proxy_cache_purge    cache_one   $host$1$is_args$args;

    }

    location ~* .*\.(php|jsp|cgi|asp|aspx)$ {

       proxy_pass http://192.168.10.10:80;

    }

  }

  server  #每一個虛擬機對應一個 server 配置,用來作判斷和轉發對站點的請求。

  {

    listen       80;

server_name  ~www[34]\.duxt\.net;  #虛擬機中綁定的域名所有寫到這裏,能夠用正則表達式

access_log off; #關閉日誌,避免訪問日誌過大佔用大量磁盤空間.

    location / {

       proxy_cache cache_one;

       proxy_pass http://192.168.10.20:80; #虛擬機的IP地址

    }

    location ~ /p(/.*)                  #清緩存鏈接地址

    {

     allow            127.0.0.1;

     allow            10.10.5.0/24;

     deny            all;

     proxy_cache_purge    cache_one   $host$1$is_args$args;

    }

    location ~* .*\.(php|jsp|cgi|asp|aspx)$ {   #不緩存動態頁面文件,若是有其餘動態頁面擴展名能夠寫到這裏

       proxy_pass http://192.168.10.20:80;

    }

  }

}

以上測試環境配置中涉及到的域名www1.duxt.netwww2.duxt.net是虛擬機192.168.10.10上的站點域名,www3.duxt.netwww4.duxt.net是虛擬機192.168.10.20上的站點域名。

一樣,與以前的方法同樣,server name指令也是支持利用正則表達式對域名進行匹配的,域名之間用空格隔開。

防火牆策略設置部分(宿主機)

對宿主機的iptables進行基本的初始化配置,設置防火牆策略的默認配置。首先要開啓防火牆的路由功能,使用如下命令實現:

echo 1 > /proc/sys/net/ipv4/ip_forward

容許訪問宿主機SSH

/sbin/iptables -t filter -I INPUT -s 0.0.0.0/0 -p tcp --dport 22 -j ACCEPT

設置默認策略

/sbin/iptables -P INPUT Drop

/sbin/iptables -P OUTPUT ACCEPT

/sbin/iptables -P FORWARD ACCEPT

/sbin/iptables -t nat -P PREROUTING ACCEPT

/sbin/iptables -t nat -P OUTPUT ACCEPT

/sbin/iptables -t nat -P POSTROUTING ACCEPT

容許內網虛擬機系統訪問外網

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.10.0/24 -j SNAT --to 10.10.5.254

利用iptables來發布虛擬機中的各類服務(宿主機)

設置IIS FTP鏈接端口爲10000。被動模式的端口範圍(10001-10005),使用如下vbs腳本命令進行修改

cscript.exe adsutil.vbs set /MSFTPSVC/PassivePortRange "10001-10005" (在Windows虛擬機中執行)

發佈內網虛擬機192.168.6.10010000-10005端口

iptables  -t nat -A  PREROUTING -i eth1 -p tcp --dport 10000:10005 -j DNAT --to 192.168.10.10

發佈內網虛擬機192.168.6.100的遠程桌面端口

iptables  -t nat -A  PREROUTING -i eth1 -p tcp --dport 3389 -j DNAT --to 192.168.10.10:3389

發佈內網虛擬機192.168.6.100MSsql端口

iptables  -t nat -A  PREROUTING -i eth1 -p tcp --dport 1433 -j DNAT --to 192.168.10.10:1433

發佈內網虛擬機192.168.6.20020000-20005端口

iptables  -t nat -A  PREROUTING -i eth1 -p tcp --dport 20000:20005 -j DNAT --to 192.168.10.20

發佈內網虛擬機192.168.6.200SSH端口

iptables  -t nat -A  PREROUTING -i eth1 -p tcp --dport 19222 -j DNAT --to 192.168.10.20:22

發佈內網虛擬機192.168.6.200Mysql端口

iptables  -t nat -A  PREROUTING -i eth1 -p tcp --dport 3306 -j DNAT --to 192.168.10.20:3306

發佈宿主機的Nginx,用於轉發對虛擬機web的請求。

iptables -t filter -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT

iptables -t filter -A INPUT -s 192.168.10.0/24 -p tcp -j ACCEPT

iptables -t filter -A OUTPUT -o eth0 -p tcp --dport 80 -j ACCEPT

保存防火牆規則

service iptables save

解決虛擬機中網站日誌中客戶端真實IP問題(虛擬機)

經過Nginx轉發一次http請求到虛擬機系統後,網站的日誌文件中記錄的都是宿主機的內網IP,影響網站日誌的訪問統計。爲了讓虛擬機系統中的網站日誌可以記錄客戶端真實IP地址,須要作相關的修改。

解決虛擬機中Apache日誌中客戶端IP問題

Apache的修改相對比較簡單

修改Apache的配置文件httpd.conf,找到LogFormat將後邊的%h替換成%{X-Forwarded-For}i 並重啓Apache.

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" Forwarded

CustomLog logs/test2.com1.log Forwarded

解決虛擬機中IIS日誌中客戶端IP問題

WindowsIIS比較麻煩一些,不能直接修改IIS日誌中的參數。

實現日誌記錄真實客戶端IP,須要藉助F5提供的一個客戶端軟件F5XforwardedFor。能夠到F5網站下載到(個人博客地址也有下載http://www.duxt.net/article.asp?id=92)

下載後,會獲得一個F5XforwardedFor.dll文件,將此文件解壓到IIS目錄或者本身建立一個目錄。

打開IIS,打開網站屬性,以下圖12

1

2

選擇ISAPI篩選器,添加一個新的篩選器,就是剛纔解壓的F5XforwardedFor.dll文件。相關配置如圖34

3

4

添加完成後,須要重啓IIS才能生效。

5

若是重啓後不生效,打開IIS web服務擴展,設置 全部未知ISAPI擴展 容許,如圖6

6

最後,將域名www1.duxt.net解析到宿主機的公網地址上,而後訪問此域名,如圖7

7

訪問幾回後,就能夠到虛擬機上去查看站點的IIS日誌了。

8

總結

本文中涉及到的iptables配置,只是用於實現對虛擬機中各類服務及端口的發佈,未涉及到宿主機及虛擬機中的安全配置。可根據我的的須要,參考其餘iptables相關的安全文檔進行設置。

另外,能夠將相關的iptables命令編寫成shell腳本,設置開機啓動運行。

有關宿主機中的Nginx做爲一個轉發代理,能夠將它的日誌功能關閉,避免沒必要要的日誌佔用大量磁盤空間。

使用iptables發佈各類服務器,在本文檔中只是簡單舉了幾個比較典型的實例,能夠根據我的的須要參照本文檔中的命令,能夠實現全部服務及端口的發佈。須要注意的是,若是你使用的防火牆規則過多,要注意規則的順序,iptables對規則的順序是有要求的。出現設置防火牆策略不生效時,要仔細檢查一下順序是否正常。

宿主機的CentOS系統能夠根據我的須要,有選擇的添加組件。建議最小化安裝CentOS,保留yum用於之後宿主機的補丁升級或者安裝各類所須要的組件。不推薦在宿主機系統中安裝過多的服務。

在解決根據域名來發布web站點問題時,也曾經使用squid來實現,可是後來通過屢次試驗發現,不管從配置的簡易程度及效率上,仍是nginx比較優秀。若是你對squid比較熟悉或者熱衷於squid也可使用squid來作網站的發佈。

最後,此方案中沒有提到服務器硬件的配置,這個能夠根據不一樣的需求配置硬件。我我的建議增長內存和提升磁盤IO是關鍵。由於運行的虛擬機多了,磁盤IO就會成爲瓶頸。

補充

1、宿主機使用32位系統後,對於大內存(4GB以上)支持問題。默認狀況下若是是CentOS通常會自動啓用PAE來支持大內存,若是你用的是其餘發佈版本,可能默認狀況下不會啓用PAE。手動安裝PAE命令以下:

yum install kernel-PAE

yum remove kernel

安裝完成後,重啓系統便可。

若是服務器內存超過4GB,建議最好仍是使用64位的系統,畢竟PAE方式作了一次地址映射,速度仍是會受到影響。

2、(未完待續)

相關文章
相關標籤/搜索