達人手札 v2.0 輕描淡寫|不求奢華

KVM主機管理與Nginx反向代理

2020-03-10

工作環境

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

設定群組

安裝完之後,我們找到虛擬機管理員

執行時如果發生以下錯誤

我們先用以下指令查看libvirtd有沒有啟動,一般來說都會啟動,是權限的問題

ps aux | grep libvirtd

之後,我們再查看我們當前的使用者有沒有在libvirt群組當中

less /etc/group

如果有,就請重新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

抓完之後,按以下的流程一路下去

這一步是將KVM的橋接路由接到我們上面自己設定的br0這個橋接上面,這樣我們才能有獨立的IP可以供外面連入,獨立的IP是由KVM自己配發的

我們先不急著安裝Debian,先進入主機資訊設定進行設定

中間安裝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 進入,看是否能看見你修改過後的網頁

如果看得見網頁,代表你的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;
    }
}
  1. 重新啟動Nginx
sudo systemctl restart nginx

Similar Posts

下一篇 開發自動化

Comments