之前,我寫過一個基於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(版本根據需要可自選) | 安裝相關應用程序Apache、FTP、Mysql | Etho0:192.168.10.20/24 網關:192.168.10.5 | |
Windows操作系統 | IIS、FTP、MSSql、Mail | 本地連接: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.net和www4.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.100的MSsql埠
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 1433 -j DNAT --to 192.168.10.10:1433
發布內網虛擬機192.168.6.200的20000-20005埠
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 20000:20005 -j DNAT --to 192.168.10.20
發布內網虛擬機192.168.6.200的SSH埠
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 19222 -j DNAT --to 192.168.10.20:22
發布內網虛擬機192.168.6.200的Mysql埠
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問題Windows的IIS比較麻煩一些,不能直接修改IIS日誌中的參數.
實現日誌記錄真實客戶端IP,需要藉助F5提供的一個客戶端軟體F5XforwardedFor.可以到F5網站下載到(我的博客地址也有下載http://www.duxt.net/article.asp?id=92).
下載后,會得到一個F5XforwardedFor.dll文件,將此文件解壓到IIS目錄或者自己創建一個目錄.
打開IIS,打開網站屬性,如下圖1、2:
圖1
圖2
選擇ISAPI篩選器,添加一個新的篩選器,就是剛才解壓的F5XforwardedFor.dll文件.相關配置如圖3、4.
圖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次圍觀