# KVM主機管理與Nginx反向代理 ## 工作環境 OS: ubuntu 18.04.3 Desktop 因為懶得打指令,所以安裝了XWindow,透過GUI工具來管理KVM,Ubuntu用桌面最小安裝就可以了 當然,最好的方式是使用Ubuntu Server,沒有XWindow,用另一台PC的virt-manager連到這台主機進行管理 ## 安裝KVM與管理工具 ``` apt install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils virt-manager ``` ## 設定群組 安裝完之後,我們找到虛擬機管理員 ![](https://i.imgur.com/jaY3TVJ.jpg) 執行時如果發生以下錯誤 ![](https://i.imgur.com/udUAMJN.jpg) 我們先用以下指令查看libvirtd有沒有啟動,一般來說都會啟動,是權限的問題 ``` ps aux | grep libvirtd ``` ![](https://i.imgur.com/NKCRpEp.jpg) 之後,我們再查看我們當前的使用者有沒有在libvirt群組當中 ``` less /etc/group ``` ![](https://i.imgur.com/1FzTX7Z.jpg) 如果有,就請重新Login之後,就可以啟動群組權限了,如果沒有,可以自己透過以下指令自己加進去 ``` usermod -a -G libvirt [使用者帳號] ``` ## 設定橋接 話說Ubuntu網路設定檔不是/etc/network/interface了,而是改用yaml做設定,在/etc/netplan底下,我的是叫01-network-manager-all.yaml 因為我是用筆電架設的,所以網路介面是wlp1s0,如果是有線網路請自己查詢自己的網路介面名稱,以下是我的設定 ``` # Let NetworkManager manage all devices on this system network: version: 2 renderer: NetworkManager ethernets: wlp1s0: dhcp4: no bridges: br: 0 dhcp4: yes interfaces: - wlp1s0 ``` 上面設定的意思是說,我將原本透過wifi連線的網路介面wlp1s0取消,改接到br0這個橋接器中,然後開啟br0這個橋接器的DHCP,讓橋接器底下所有的網路介面都可以互通,設完之後我們重啟NetworkManager服務 ``` systemctl restart NetworkManager.service ``` ## 一個IP多個Web Site架設範例 我們Server用Debian Stable進行架設,會有二台,分別是Web1與Web2,可以到以下網站抓Debian Stable 最小安裝檔iso [https://www.debian.org/distrib/netinst](https://www.debian.org/distrib/netinst) ![](https://i.imgur.com/WeFQEPj.jpg) 抓完之後,按以下的流程一路下去 ![](https://i.imgur.com/eY29yTk.jpg) ![](https://i.imgur.com/hSksV66.jpg) ![](https://i.imgur.com/SbJLDg2.jpg) ![](https://i.imgur.com/CLxIo99.jpg) ![](https://i.imgur.com/bqtlnpf.jpg) ![](https://i.imgur.com/mST2x6u.jpg) ![](https://i.imgur.com/pzinrcj.jpg) ![](https://i.imgur.com/Xz7l9Vf.jpg) ![](https://i.imgur.com/TP9SX8N.jpg) ![](https://i.imgur.com/7horgbZ.jpg) ![](https://i.imgur.com/XR6M20r.jpg) ![](https://i.imgur.com/h5Ph0rd.jpg) ![](https://i.imgur.com/Zs5mi91.jpg) 這一步是將KVM的橋接路由接到我們上面自己設定的br0這個橋接上面,這樣我們才能有獨立的IP可以供外面連入,獨立的IP是由KVM自己配發的 ![](https://i.imgur.com/jG5hE0f.jpg) 我們先不急著安裝Debian,先進入主機資訊設定進行設定 ![](https://i.imgur.com/Id6odAf.jpg) ![](https://i.imgur.com/auAUt5H.jpg) ![](https://i.imgur.com/vSLneHU.jpg) 中間安裝Linux的過程略過,請自行依照需求設定安裝細項,如果是開發機我會這樣設計 Directory: /boot ext4 50MB /swap N/A 8192MB / ext4 All Spaces Config: Host Name: Web1 Domain Name(範例): taipay.com.tw Timezone: Asia/Taipei Install: SSH Server Base System 安裝完系統之後,重新開機完,我們可以打以下指令查看KVM給我們的VM分配的IP ``` ip addr ``` 然後可以透過以下指令查詢Gateway ``` router -n ``` 好比我被分配到的IP是192.168.122.142,而Gateway是在192.168.122.1,網卡是叫ens3,這時我們要進行設定,將這組IP設置成靜態IP,這樣下次開啟VM時,才能確保都是同一組設定 ``` vim /etc/network/interface ``` 將以下設定 ``` iface ens3 inet dhcp ``` 改成如下 ``` iface ens3 inet static address 192.168.122.142 netmask 255.255.255.0 gateway 192.168.122.1 ``` 然後重新啟用網路設定 ``` systemctl restart networking ``` 或是重新啟動 ``` reboot ``` 然後我們下以下指令安裝Nginx ``` apt install nginx ``` 安裝完了之後,修改/var/www/html/index.nginx-debian.html,裡面給它用HTML在Title與Body中標一個大大的Web1 然後我們在Host OS開啟Firefox,輸入 [http://192.168.122.142](http://192.168.122.142) 進入,看是否能看見你修改過後的網頁 ![](https://i.imgur.com/pZNSaQl.jpg) 如果看得見網頁,代表你的Host OS是可以連到Guest OS的,所以接下來我們要設定讓外面的主機也可以看見你KVM上的網頁 我們先在Host OS安裝Nginx ``` apt install nginx ``` 進入/etc/nginx/sites-available中,新增web1設定檔,並寫入以下設定 ``` server { listen 80; server_name web1.taipay.com.tw; location / { proxy_pass http://192.168.122.142:80; } } ``` 然後透過以下指令將網頁設定檔移到/etc/nginx/sites-enabled中 ``` ln -s /etc/nginx/sites-available/web1 /etc/nginx/sites-enabled ``` 然後重新啟動Nginx,這樣反向代理就設定完成了 ``` systemctl restart nginx ``` 然後我們要怎麼用外部機器連到我們的Guest OS裡面呢?假使我們沒有買DNS,以下是我透過其他台NB,作業系統是Ubuntu Desktop 18.04.3的客戶端做的測試 請先在該台NB的/etc/hosts寫入一行 ``` 192.168.20.157 web1.taipay.com.tw ``` 請注意,這時前面的IP,是我Host OS的IP,而不是輸入Guest OS的IP,因為你要先連到Host OS,才能透過Host OS底下的Nginx針對網址做解析,並反向代理指向到正確的VM,也就是Web1主機上,之前我們在Host OS寫入的web1檔案,裡面的server_name,就是對應網址用的 那如果說我有web1 ~ web5呢?但我沒有DNS,一樣你可以在你客戶端NB的/etc/hosts做以下設定 ``` 192.168.20.157 web1.taipay.com.tw 192.168.20.157 web2.taipay.com.tw 192.168.20.157 web3.taipay.com.tw 192.168.20.157 web4.taipay.com.tw 192.168.20.157 web5.taipay.com.tw ``` 這樣就算只有一個IP,也可以因為吃的網址不同,而進入不同主機了 ## Nginx SSH 反向代理 1. 編輯 /etc/nginx/nginx.conf 2. 參考以下設定,寫入到http之前,events的下面 ``` stream { server { #格式 listen [你對外監聽的Port]; proxy_pass [你主機的Domain Name Or IP]:[port]; } server { #範例 listen 10022; proxy_pass 192.168.122.132:22; } } ``` 3. 重新啟動Nginx ``` sudo systemctl restart nginx ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up