歡迎您光臨本站 註冊首頁

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

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0


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

經過近段時間的研究和測試,成功的將朋友的伺服器遷移到了Linux平台,使用Linux系統和一些開源軟體使伺服器託管利用虛擬化技術和免費開源軟體、系統再次降低成本,同時又提高了系統的性能.

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

1、 共享一個公網

IP地址,發布多個虛擬機中的各種服務.

2、 多個虛擬機中的web站點共享80埠,實現通過域名訪問虛擬機中的站點.

3、 宿主機上全部使用免費開源的操作系統及軟體,節省軟體費用.

4、 利用Linux下強大的iptables來保護伺服器,相比Windows下的防火牆性能更優秀.

5、 Nginx超強的高併發處理能力、低系統資源開銷,使伺服器能夠處理更多的併發web訪問請求.

6、 利用Nginx的反向代理緩存功能,為Windows虛擬機站點加速.(新加入的一個優化配置)

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

添加此節內容,是為一些需要將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(宿主機)

1、 安裝Nginx所需的pcre:

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

tar zxvf pcre-8.01.tar.gz

cd pcre-8.01/

./configure

make && make install

cd ../

2、 安裝Nginx清理緩存模塊

使用此模塊可以實現緩存的清理任務

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

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

3、 安裝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 ../

4、 修改

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;

5、 配置開機自動啟動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.net

www2.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.100

10000-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、(未完待續)


[火星人 ] 伺服器虛擬化託管方案——Linux篇(第二版)已經有867次圍觀

http://coctec.com/docs/linux/show-post-50887.html