Bug 還在協商溝通,暫時解不掉,只能先想辦法繞過。因關鍵服務大多利用 HTTP,所以決定用 nginx 建立 reverse proxy 解決。
整件事最大困難:QNAP 系統高度自製,很多資料找不到。很多工具沒有裝(例如 apt-get)。
本來考慮用 QNAP 軟體市集找 nginx,失敗,改用 container station 上。用 nginx container,以 docker volume 覆蓋設定檔。
然後發現 container station GUI 並不友好。例如 exposed port、volume 等參數每次建立 container 都要重新指定,非常麻煩。docker volume 還只能指定一整個目錄,無法只覆蓋目錄下的單一檔案,所以萬一 config 檔同目錄還有其他檔案就不好處理。
後來解法是 ssh,command line 用 docker 指令就好。container station 的 GUI 只是套殼,其實沒必要用。docker 指令操作結果也會反映在 container station 的介面上。File Station 看到的 Public 資料夾在 /share/Public。文字編輯可以用 Text Editor 就不必用沒調整過的 vi,還支援瀏覽器貼上!
QNAP 上 docker 操作 nginx 我用的指令如下:
docker run --rm -p 9080:9080 -p 8888:8888 -p 9090:9090 --name nginx -v ${PWD}/minimal.conf:/etc/nginx/nginx.conf:ro -d nginx
nginx.conf 設定檔長這樣
events {}
http {
client_max_body_size 0;
server {
listen 9080;
server_name <QNAP 內網 IP>:9080;
proxy_set_header Host <QNAP 內網 IP>:9080;
location / {
proxy_pass http://<VM IP>:80;
}
}
server {
listen 9090;
server_name <QNAP 內網 IP>:9090;
proxy_set_header Host <QNAP 內網 IP>:9090;
location / {
proxy_pass http://<VM IP>:808;
}
}
server {
listen 8888;
server_name <QNAP 內網 IP>:8888;
location / {
proxy_pass http://<VM IP>:8888;
}
}
}
port 9080 和 9090 分別對應不同 Laravel 服務。port 8888 給 jupyter-notebook 用。jupyter-notebook 必須修改 NotebookApp.allow_origin 允許 cross origin API 不然修改會無法存檔。
nginx 設定 client_max_body_size 是避免用 notebook 上傳檔案的時候因檔案太大導致上傳失敗,設定 proxy_set_header Host 可避免 Laravel 的 redirection 錯誤導向到 VM IP。
Laravel app 也必須修改,包括:
.env
PROXY_URL = <QNAP 內網 IP>:port
PROXY_SCHEMA = http
app/Http/Middleware\TrustProxies.php
protected $proxies = [
'**'
];
routes/web.php
$proxy_schema = env('PROXY_SCHEMA');
if (!empty($proxy_url)) {
URL::forceRootUrl($proxy_url);
}
if (!empty($proxy_schema)) {
URL::forceScheme($proxy_schema);
}
設定好後需重啟 Laravel
其他工具也可以透過 docker 使用。例如使用 git docker container 把 working directory 掛載進去做 commit。就可以繞過 QNAP 一堆東西都沒裝,偏偏還不好修改的問題。
全文連結
0 意見:
張貼留言