以前,我寫過一個基於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(版本根據須要可自選) |
安裝相關應用程序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(宿主機)
一、 安裝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.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、(未完待續)