Proxmox 安裝完成後(這程式安裝步驟在網路上應該不少),但不少文件都仍是以1.X的版本及畫面來說明,有時我還真對不上。
主要第一次使用不熟悉,陣子因為抽到OVH Alphas Test Server,又聽虛擬化這字熱很久了,自己工作上雖偶有用到,只是侷限在筆電上安裝VritualBox,也就那麼一個GUEST能跑,再多也跑不動,所以有不少虛擬化東西不怎明瞭。
而這次的學習過程裡,不得不讚賞OVH的Manager V3 只有按下要的OS就能成功的安裝想要的OS,提供的選擇很多,其中一個就是Proxmox 2.0按下後,不用20分鐘就全好了。
再來就是我的虛擬化之旅,以下就是日記~記得很亂主因有些東西我自己已知道怎麼弄就跳過不記。共花了我三天右右的時間,將近一天瞭解一些字眼及虛擬化的訊息,再接下來把我Blog and Seedbox 試著搬到這台測試主機,其中一個IP對我來說真的還蠻痛苦的。
這裡記錄了
– 如何下載範本
– 如何設定VM,網路及Reverse Proxy
– 使用Pound 接收 443(SSL)連線,並搭配CloudFlare免費SSL
– Apache Log 更動才能記錄由Client 端IP
– 換掉 Apache2 改用 Nginx (April/25)
1. 下載範本(Download Template), 一開始找不到, 請參考下圖在Node 內Content的 local 下。範本的功能,應該是用來快速建立及設定你要的OS及APP,而不用在大費周章去準備及安裝。
- 其中在同畫面內可分為 VM及Container ,而Container 就是 OpenVZ目前全都都安裝OpenVZ.
- 網路部分有不少東西要弄,以前都用ipfw 現在用iptables 指令還真不太習慣,常打成 iptable,只好用alias 幫忙!
- 這台測試機器的規格可以參考 Ovh Alpha Test Server ,該站站主還希望大夥能夠利用 iperf 測試協助OVH提供更好的routing route! Please participate for testing, click the link of Ovh Alpha Test Server in ahead sentence , under Iperf section has an instruction how to test.
而網路設定的部分參考 Network_Model ,我之前常用的VPS或Seedbox都是利用Bridge 方式做出來的,每個Guest OS都可以配置自己的IP,當然與HOST會同網段,真的要成立一家公司VPS要備不少IP。 另外可以參考 Virtual Networking Explained 這篇則是解釋常見的字及使用的時機。
我用的主機是 Kimsufi dedicate 只配 1 個 IP(可額外購買IP). 因此不能用Bridge Mode,只能用NAT方式,把所有GUEST主機網卡封包導給HOST上的 eth0 或 eth1 等。 這個概念試了好久,網路上文章也沒有直接說明。 一般來說安裝Proxmox給了二個Bridge 卡(交換器),可惜我們都用不到(vmbr0 , vmbr1)
–Setting Guest an Host IP address and masquerad , if you dedi server only has one ip address!
首先設定HOST的網路,需要先編輯 /etc/network/interfaces 把真實IP加上
Host eth0 為真實IP
Host 內虛擬網卡設定 Guest 網段,指定到 192.168.0.x (private network) 網段,
Host iptables 需要加入,把連接3022埠的封包導到內網主機 192.168.0.100 的 22埠,這樣我才能由外網(家裡)管理這個VM。
在Proxmox Host主機上只要選定一個埠,指到後端某台GUEST 的IP及埠就可以了. 這裡是連接 Host(Real IP) 的 30022 埠後轉接到 192.168.0.100 SSH 埠去.
iptables -t nat -A PREROUTING -p tcp -i eth0 --destination-port 30022 -j DNAT --to-destination 192.168.0.100:22
iptables -A FORWARD -p tcp -i eth0 --destination-port 22 --destination 192.168.0.100 -j ACCEPT
– Save iptables and automatically apply while system boot up.
iptables-save > /etc/iptables
put config into interfaces
auto eth0
iface eth0 inet static address 8.18.x.x netmask 255.255.255.0 broadcast 8.18.x.255 gateway 8.18.x.254 post-up echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp pre-up iptables-restore < /etc/iptables.rulesl
-設定Guest OS
- 如果是 ubuntu base
– apt-get install sudo denyhost lftp curl
– apt-get update ; apt-get upgrade
– modify network/interfaces
- 當使用turnkey application template(版本時,因為第一次開機時,你無法連線進入設定,所以開頭的設定無法進行..相關的啟動設定可以參考 Inithooks
– 需手動去執行 /usr/lib/inithooks/firstboot.d/ 內的檔案, 以wordpress為例,在安裝重開VM後怎麼都沒法子登入也沒有設定過admin的密碼,就要利用目錄內檔案,手動執40wordpress這個檔案設定密碼,phpmysql 接連 mysql帳號則要執行 35mysqlpass
– Reverse Proxy
為何會用到Reverse Proxy(RP)主要是因為在單一真實IP環境,所有的VM都躲在虛擬IP網段之內,利用NAT方式出網無法接收來自80(WWW)的要求,因此利用RP把瀏覽網站的80埠需求先接下,再導到後端(虛擬)VM,對瀏覽者來說是透明的沒感覺,跟瀏覽一般網站相同。
當然你也可以把所有 80及 443 埠給全部導到後面WEB VM 也行,但少了分流及快取的功能。
這裡假設我們有二個需求分別是BLOG與rutorrent的話,就會需要分流(RP)才能搞定。
- Varnish Reverse Cache
Ubuntu 10.04 TLS內建版本比官網舊是2.1版,建議更新為最新版本
curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add - echo "deb http://repo.varnish-cache.org/ubuntu/ lucid varnish-3.0" >> /etc/apt/sources.list apt-get update apt-get install varnish
方案A-Varnish 不支援ssl,所以假設要使用SSL,網路上是有方法利用 Nginx 接SSL後把request forward 到 varnish 再到後端的apache ,有點麻煩但還可以做。 只是因為Proxmox與apache之間相依度太高,有用到一些特有的mod,使得更換成Nginx變的不可能。 另default.vcl 的撰寫很重要,如果錯誤會導致網頁的狀況不正確,例如rutorrent 頁面每60秒就要重新登入一次。
方案B-前端把80 及 443埠直接導到後端apache(wordpress)主機也行,但未來你可能同時架了二台以上的WEB,此時有個中繼者做分流及快取能夠加大服務能量。
iptables -t nat -A PREROUTING -p tcp -i eth0 --destination-port 443 -j DNAT --to-destination 192.168.0.101:443
方案C-Pound加入。其實利用方案B很快,也不用頭痛什麼,或許有些小地方要修改!想想要學就都嘗嘗看看,加上不少人利用此方法完成我想要的,就試著使Pound收取SSL。
安裝sudo apt-get install pound
修改/etc/pound/pound.cfg, 其中的Cert 參數很重要,沒有這個檔案將無法接收SSL請求。
ListenHTTPS
Address 8.18.x.x
Port 443
Cert "/etc/pound/server.pem" #從Couldflare取得的SSL證書
AddHeader "X-Forwarded-Proto: https"
HeadRemove "X-Forwarded-Proto"
Service
BackEnd
Address 內部WEB主機位址
Port 80
End
End
End
其中pem檔,利用下方指令產生,一種是由下方方式產生,另一種是後來我由Cloudflare 下載的,其實這塊怎麼運作有點模糊,觀念也可能錯誤,但至少可以執行。
openssl req -x509 -newkey rsa:1024 -keyout server.pem -out server.pem -days 1095 -nodes。
-Secure Proxomon manage page
因為主機的80埠被導到後端WWW主機,但管理介面的登入也希望能夠有所限制。
- 用iptables 的方式,限制只能某IP能夠連接8006 埠其他的都不行,而443埠給Pound -> Varnish 了所不用濾掉!
iptables -A INPUT -p tcp -i eth0 ! -s 114.32.x.x --dport 8006 -j DROP
- 由apache 來管控! 放棄太麻煩了!
– Rsync my blog to wordpress guest OS
這裡其實還有 xml and wp-backup 等方式,甚至由 phpmyadmin 匯出 db 再匯入至新主機上也行!
ssh-keygen -t rsa scp ras.pub to remote server /usr/bin/rsync -zavr -P --log-file=/tmp/r-synlog.log --bwlimit=1024 --rsh="ssh -l nobody -c arcfour" 203.x.x.x:/var/www/wordpress/wp-content/ .
– Ip Failover
- Alias IP 的概念 還沒申請,但可以試試看。 1英鎊,還真他媽的貴! 其實就是Alias IP ,那給的是不同網段的IP,只是Mac Address 應該是相同的
DEVICE="eth0:0" BOOTPROTO="static" IPADDR="IP.FAIL.OVER" NETMASK="255.255.255.255" ONBOOT="yes" BROADCAST="IP.FAIL.OVER"
– Apache Log
這樣才能LOG到由前端Varnish or Pound 丟過來Request 中的Client IP.
LogFormat "%v:%p %{X-Forwarded-For}i %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" vhost_combined
– RIPE Failover
如果你有其他的需求超過3個IP以上就要考慮OVH RIPE Failover IP ,但收費不便宜 每月有15.0 英鎊的Professsional Service Fee and each IP add 1.0 GBP
What’s the benefit of Virutalization (虛擬化的好處)
我在想一台主機如果功能強大就能包含所有的服務,那有什麼特別的原因,需要虛擬化呢. 我到現在還接觸不久.也說不上來.
- 想到在搬動主機時方便,可以把自己的Guest OS整個dump下來就直接到另一家的主機。
- 可以動態的增加CPU及記憶體,這點與Amazon EC2 這些服務是否相似呀,不管如何對Admin或使用者來說是件好事
接下來修改文件,其中不少東西要加, nginx 不支持 .htacess 還有wordpress 中的一些 rewrite rules!
– Replace Apache2 with Nginx + php5_fpm
會這麼做,原因是Blog 虛擬機 Apache2 太吃記憶體,1G的記憶體每天都用的滿滿的,雖然有減少fork的apach2,幫助還是不大,這站說實話一天20個瀏覽量就很好了!所以只好換了另一個 風評很好的http server Nginx (發音很像engine-x),只是它無法處理php網頁,需額外安裝php5-fpm,而為不用常見的fast-cgi,而改用php5-fpm是它的效能比fast-cgi或spawn-cgi整體上快了些。
整個更換的步驟不會很難,安裝很簡單
sudo apt-get install python-software-propertiessudo sudo add-apt-repository ppa:brianmercer/php5 sudo apt-get update; sudo apt-get -y upgrade sudo apt-get install php5-fpm php5-cgi php5-mysql php5-curl php5-gd php5-geoip php5-xmlrpc php5-xsl php5-json sudo apt-get remove apache2
接下來修改文件,其中不少東西要加, nginx 不支持 .htacess 還有wordpress 中的一些 rewrite rules!
vi /etc/php5/fpm/php-fpm.conf
pid = /var/run/php5-fpm.pid error_log = /var/log/php5-fpm.log
vi /etc/php5/fpm/pool.d/www.conf
pm.max_children = 15 pm.start_servers = 4 listen = /var/run/php5-fpm.sock pm = dynamic
第3行的地方,據網站說明使用sock的速度會比使用tcp:port來的再快一點。
vi /etc/nginx/nginx.conf
user www-data; worker_processes 4; pid /var/run/nginx.pid; events { worker_connections 768; multi_accept on; use epoll; } log_format main '$remote_addr "$http_x_forwarded_for" - $remot e_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"' ; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log;
第11行內
"$http_x_forwarded_for"
,主要目的是記錄真實的用戶IP,情況與上頭Apache一樣,不改就只會看到前端的varnish主機IP。這裡並沒有把全部的config貼上,大都用預設值就夠這小站用了。
vi /etc/nginx/sites-enabled/wordpress 建立wordpress(站台)設定值
server { root /var/www/wordpress; index index.php index.html index.htm; access_log /var/log/nginx/blog.funseed.net.access.log main; error_log /var/log/nginx/blog.funseed.net.error.log; server_name blog.funseed.net ; if ($host != 'blog.funseed.net') { rewrite ^/(.*) https://blog.funseed.net/$1 permanent; } location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }
第7-8行,是把網友點擊google搜尋網址由原先站名改成新的站台網域blog.funseed.net
至/etc/nginx/sites-available 目錄把 default 刪除,並建立
ln -s /etc/nginx/sites-available/wordpress wordpress
啟動php5-fpm and ngixn
– SSL(CloudFlare)
站台SSL目前使用Cloudflare(以下簡稱CF)的免費SSL,這事也弄了幾天原因是設定好後,連接會出現Error 400 〞The plain HTTP request was sent to HTTPS port “
一直沒想到原因,主要不夠熟悉,各程式扮演角色,還有年紀大了
要有SSL最快的方式可以將下列功能開啟,支援的模式有很多種,最快的方式選擇Flexible 即可
各項的差別
Flexible 是用戶與CF之間加密,但站台與CF之間是明碼,不加密,你的伺服器不用額外申請SSL證書,方便許多,最重要是用戶在瀏覽你站台是會看到有〞鎖頭〞標示
另外Full SSL/Full SSL(strict) 則是三方間傳輸都有加密,但strict模式是你的SSL證書是要被認可的,不是網路上常用的自行簽發證書(self-signed ssl certificates),目前我的站台使用strict 模式,是使用CF給的Certficates。
要使用strict 模式、可以在CF管理介面中的Crypto 找到下方的功能,申請Certificates,會取得Private Key and Certification 二個檔,再分別存到Pound所在伺服器中,主要是因為我用pound接CF送來的SSL 連線,所以這個證書是放在pound中,而非nginx 伺服器內
並將這CF的這個功能打開、可避免一個頁面同時使用https 也有http的情況,用戶端才不會出現警告訊息