如果想要在伺服器上搭建反向代理,Nginx 是最常用的選擇。但是,它的配置對於新手略顯複雜,對於老鳥來說也不算多方便,因此也有人選擇 Caddy 等更為方便的配置工具。然而,對於新手來說,還有可視化的 Nginx 配置方案:Nginx Proxy Manager,提供 Docker 鏡像,搭建起來也很方便。
安裝 Docker#
可以看Install Docker Engine | Docker Documentation,選擇自己的系統即可。如果還沒有選系統,強烈建議使用 Debian。
如果你全程使用 root 用戶,也是可以的,但是很不推薦這種做法,有很大安全隱患,而且以後可能在權限管理方面遇到麻煩。
對於絕大多數發行版,可以使用以下的腳本一鍵安裝,但是文檔稱這種安裝方法不推薦用於生產環境,自行斟酌。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
建議使用一個普通用戶進行操作,安裝之後按照Manage Docker as a non-root user裡的方法將用戶添加至 docker 用戶組,避免每次使用 Docker 命令都要加 sudo。
不建議使用 rootless mode,即不以 root 權限運行 docker daemon,一些程序可能會出問題。
有些比較舊的教程還會要求安裝
docker-compose
,但是現在版本的 Docker 內置了一個帶空格的docker compose
,我到現在用起來沒有發現區別,所以也不用安裝docker-compose
了,都用docker compose
吧。
安裝 NPM#
-
首先,cd 進一個你喜歡的目錄,以
~/docker/
為例。 -
然後新建一個文件夾用於存放 npm 的數據:
mkdir npm && cd npm
-
無論使用什麼方法,把下面的代碼放進一個新建的
docker-compose.yml
裡:version: '3' services: app: image: 'jc21/nginx-proxy-manager:latest' container_name: 'npm' restart: unless-stopped ports: - '80:80' - '81:81' # 冒號左邊可以改成自己伺服器未被佔用的端口 - '443:443' volumes: - ./data:/data # 冒號左邊可以改路徑 - ./letsencrypt:/etc/letsencrypt # 冒號左邊可以改路徑
-
啟動容器
docker compose up -d
-
瀏覽器中打開 https:// 你的伺服器 ip:81 登錄。默認 email:
[email protected]
,默認密碼:changeme
-
登錄後顯示更改賬戶名、密碼等等,但是此時不要著急填寫真實信息,先隨便寫一個應付一下,因為現在還是 http 的連接,不安全。
安裝部分到此就可以了,接下來以 npm 本身為例,演示如何做反向代理。
反向代理#
從結果上來說,反向代理最直接的作用就是可以通過域名訪問了,而不是 ip: 端口;同時,HTTP 也變成了 HTTPS。
配置域名#
反向代理需要一個域名。
購買域名#
首先,如果只是想搞著玩的,可以去 Google 一下有沒有可以白嫖的域名。就目前而言,我知道的可以白嫖的域名有 .link
和 .eu.org
,可以搜一搜怎麼搞。
如果想要長久使用的話,最好還是選一個自己喜歡的域名,在經濟可承受範圍內可以短一點,例如我的 yfi.moe
,yfi 是 Yunfi 的縮寫,而選 moe 的理由如下圖:
我的域名都是在 NameSilo 買的,他家的 .com
域名是 10 刀出頭,應該是最便宜的那一批;比較實惠的是 .top
域名,首年 $1.88,續費 $4.88。購買時使用我的優惠碼(Coupon)還可以再優惠 $1:yunfi
通過 Cloudflare 管理域名(可選)#
Cloudflare 是一個全球網絡,旨在讓您連接到互聯網的一切都安全、私密、快速和可靠。
Cloudflare 在網絡方面已經是一方巨擘,提供了免費的 CDN 和其他各種服務。我們要做的是把域名的 DNS 伺服器改成 Cloudflare 的,以方便的管理 DNS 記錄,本文之後也都使用 Cloudflare 作為例子。
先註冊 Cloudflare,然後添加站點(Zone),按照提示操作。之後會提示我們在域名註冊商把 DNS 伺服器改成 Cloudflare 的兩個,如果你使用的 NameSilo,去域名管理頁面點 Options 裡的最後這個圖標
把原來的刪了,填上 Cloudflare 給的兩個就行。
添加 DNS 記錄#
在 Cloudflare 上,先去 SSL/TLS 頁面,將加密模式改為 “完全(嚴格)”
再點開 DNS 頁面,添加記錄:
- 類型:A(對於 ipv6,使用 AAAA)
- 名稱:新的子域名
- IPv4 地址:伺服器 IP
- 代理狀態:開啟就是使用了 Cloudflare 的 CDN,可以保護自己的 IP 不被他人獲知,但是國內並不快,如果是國內伺服器可以不开。
設置 Proxy Host#
-
轉到 npm 主頁,點進 Proxy Host,點擊 Add Proxy Host
-
如下填寫:
- Domain Name:之前設置的域名,這裡是
nginx-demo.yfi.moe
- Forward Hostname/IP:可以填伺服器的外網 IP,也可以填對於 Docker 容器來說宿主機的 IP,一般是
172.17.0.1
- Forward Port:之前設置的端口,這裡的例子裡是 81。
- 下面的三個開關,對於 npm 來說都可以開,但是對於有些應用來說開了可能出問題,需要自行測試。
- Domain Name:之前設置的域名,這裡是
-
點擊選項卡的 SSL 界面
- 選擇 Request a new SSL certificate。
- 一定要勾選 Force SSL,剩下的看自己需求。
- 郵箱不一定填自己的,但是要是不太離譜的(不然會被 Let's Encrypted 拒)
-
點擊確定,可能要等上近 10 秒,因為要向 Let's Encrypted 申請證書。
此時訪問 https://nginx-demo.yfi.moe,就可以看到登錄界面了,同時地址欄上也出現了小鎖,說明現在已經受到了 HTTPS 的保護。
** 這時,可以修改郵箱、密碼為正式使用的了。** 之後申請證書的郵箱也可以用自己的了,這樣在證書快過期的時候可以受到郵箱通知(雖然 npm 會自動續期)。
申請通配符證書(可選)#
雖然上面的過程也可以用,但是每次加新的 Proxy Host 都要申請新證書,實在算不上方便。所以,可以申請類似 *.yfi.moe
的證書,對於所有的都可以生效。(對於 yfi.moe
本身不行,需要另外申請)。
- 進入 npm 的 SSL Certificates 頁面,點擊 Add SSL Certificate,選擇 Let's Encrypted。
- 輸入域名
*.yfi.moe
,並勾選 Use a DNS Challenge - 在新出現的輸入框中 DNS Provider 選擇 Cloudflare。
- 轉到 Cloudflare,從右上角進入個人資料,再點擊左側的 API 令牌
- 點擊創建令牌,選擇 “編輯區域 DNS” 的模版
- 區域資源選要添加的域名,其他的不用改,點擊 “繼續以顯示摘要”,再點 “創建令牌”
- 複製後,粘貼到 npm 第二個框的等號後面,然後點確認。
之後的反代都可以使用這個證書。
尾聲#
與 Nginx 相比,Nginx Proxy Manager 肯定不如它靈活,但是我認為實在易用性和靈活性中取了平衡的,不然光是一個證書問題就要畫好久,肯定沒有點兩下來的方便。
NPM 還支持重定向、流式傳輸、自定義 Nginx 代碼等,其實還是比看上去要靈活不少的。
FAQ#
待續