Nginx多個子域名映射到不同的埠或 ip
- 2019 年 10 月 31 日
- 筆記
場景介紹 在部署 DevOps 環境時,多個服務通過 Docker 部署到一個伺服器上,映射到不同的埠。 現在每次訪問,都要帶上埠號,既不美觀,也很麻煩。
一、思考過程
- 如果不想帶上埠號,就只能訪問 80 或 443 埠。
- 可以用過二級目錄區分服務,通過反向代理轉發到不同的 Server。
- 可以用過子域名區分服務,通過反向代理轉發到不同的 Server。
二、方案評估
- 對於不帶埠號訪問,以我目前的經驗來看,找不到其它更好的方法,只能使用 80 或 443 埠。
- 使用二級目錄區分服務,可行性很大。
- 能通過二級目錄名,明確區分服務。
- 可是和直接使用埠號差別不大,只是把辨別服務的方法,從埠號變成了二級目錄名。
- 可能導致 url 過長。
- 還是沒有什麼美觀性。
- 使用子域名區分服務,可行性與二級目錄相差無幾。
- 能通過子域名,明確區分服務。
- 具有一定的美觀性。
三、方案確定 和 方案設計
我決定採用採用 子域名區分服務 的方式,然後使用 nginx 做反向代理,分發到不同的埠。
1. 本地測試
注意 我使用的環境是 Ubuntu Desktop 桌面作業系統。
- 首先安裝 nginx
# 使用 Ubuntu 包管理器中的 nginx 即可。 $ sudo apt update $ sudo apt install nginx
- 安裝 Docker 和 Docker Composer參考官方文檔 Get Docker CE for Ubuntu 和 Install Docker Compose。
- 創建目錄結構
# 我使用的是 Jetbrains 全家桶; # 這裡比較麻煩。 $ mkdir -p DevOps $ cd mkdir $ mkdir -p gitlab registry teamcity mysql $ mkdir -p -m 750 hub/backups hub/conf hub/data hub/logs youtrack/backups youtrack/conf youtrack/data youtrack/logs upsource/backups upsource/conf upsource/data upsource/logs $ sudo chmod -R 13001:13001 hub youtrack upsource $ touch docker-compose.yml
- 編寫 docker-compose.yml 配置文件version: 『3』 services: gitlab: image: gitlab/gitlab-ce:latest restart: always hostname: 『gitlab.tricker.org』 prots: – 8888:80 – 2222:22 volumes: – 『./gitlab/config:/etc/gitlab』 – 『./gitlab/data:/var/opt/gitlab』 – 『./gitlab/logs:/var/log/gitlab』 environment: GITLAB_OMNIBUS_CONFIG: | external_url 「http://gitlab.tricker.org」 gitlab_rails[「gitlab_shell_ssh_port」] = 2222 networks: devops: aliases: – 『gitlab.tricker.org』 registry: image: registry:latest hostname: 『registry.tricker.org』 ports: – 5555:5000 volumes: – 『./registry/data:/var/lib/registry』 networks: devops: aliases: – 『registry.tricker.org』 hub: image: jetbrains/hub:2019.1.11584 hostname: 『hub.tricker.org』 ports: – 18080:8080 volumes: – 『./hub/data:/opt/hub/data』 – 『./hub/conf:/opt/hub/conf』 – 『./hub/logs:/opt/hub/logs』 – 『./hub/backups:/opt/hub/backups』 networks: devops: aliases: – 『hub.tricker.org』 youtrack: image: jetbrains/youtrack:2019.2.54193 hostname: 『youtrack.tricker.org』 ports: – 18081:8080 volumes: – 『./youtrack/data:/opt/youtrack/data』 – 『./youtrack/conf:/opt/youtrack/conf』 – 『./youtrack/logs:/opt/youtrack/logs』 – 『./youtrack/backups:/opt/youtrack/backups』 networks: devops: aliases: – 『youtrack.tricker.org』 depends_on: – hub upsource: image: jetbrains/upsource:2019.1.1432 hostname: 『upsource.tricker.org』 ports: – 18082:8080 volumes: – 『./upsource/data:/opt/upsource/data』 – 『./upsource/conf:/opt/upsource/conf』 – 『./upsource/logs:/opt/upsource/logs』 – 『./upsource/backups:/opt/upsource/backups』 networks: devops: aliases: – 『upsource.tricker.org』 depends_on: – hub – gitlab teamcity: image: jetbrains/teamcity-server hostname: 『teamcity.tricker.org』 ports: – 18111:8111 volumes: – 『./teamcity/data:/data/teamcity_server/datadir』 – 『./teamcity/logs:/opt/teamcity/logs』 networks: devops: aliases: – 『teamcity.tricker.org』 depends_on: – mysql – gitlab networks: devops:
- 修改 hosts 文件
# 注意: 這裡一定要使用 root 許可權。 $ sudo vim /etc/hosts # 關於 vim 的使用,此處不再複述,有問題找百度。 127.0.0.1 gitlab.tricker.org 127.0.0.1 registry.tricker.org 127.0.0.1 hub.tricker.org 127.0.0.1 youtrack.tricker.org 127.0.0.1 upsource.tricker.org 127.0.0.1 teamcity.tricker.org
- 修改 nginx 配置
# 進入 nginx 文件夾,這個文件夾內的操作,幾乎都需要 root 許可權。 $ cd /etc/nginx $ cd sites-available/ $ sudo mv default default.backup $ sudo vim devops server { listen 80; server_name gitlab.tricker.org; location / { proxy_pass http://127.0.0.1:8888; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name registry.tricker.org; location / { proxy_pass http://127.0.0.1:5555; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name hub.tricker.org; location / { proxy_pass http://127.0.0.1:18080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name youtrack.tricker.org; location / { proxy_pass http://127.0.0.1:18081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name upsource.tricker.org; location / { proxy_pass http://127.0.0.1:18082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name teamcity.tricker.org; location / { proxy_pass http://127.0.0.1:18111; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } #
重啟 nginx 打開瀏覽器訪問相應的子域名,就可以轉到相應的服務了。 $ sudo systemct restart nginx