---
# System prepended metadata

title: KVM主機管理與Nginx反向代理

---

# 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
```