接到指令要安裝一台 Nginx 當 Reverse Proxy。依過去幾次經驗估計是件簡單任務,應可在半小時內搞定。基本上就是照著(How to install and use Nginx on CentOS 7 / RHEL 7)的步驟,再依先前筆記在 /etc/nginx/conf.d 加入一個 my-web1.conf:

server {
    listen        80;
    location / {
        proxy_pass         http://remote-server:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

有別於過去自己玩是用 CentOS,這回要安裝的 Linux 版本是 RHEL,但問題不大,CentOS 是移除 RedHat 商標的 RHEL,本質相同。但另一個限制就讓缺乏經驗的 Linux 麻瓜狠摔一跤,難度由接小孩提高成進火場救人,工時也從 30 分鐘暴增到 3 小時。受限網路政策,要裝 Nginx 的 Linux 主機無法連上網際網路,yum install nginx 一行搞定安裝的如意算盤被砸個粉碎!

第一次遇到離線安裝 rpm 挑戰,摸索一陣子才找到解法,筆記如下:

  1. 找一台可上網的 CentOS 或 RHEL,使用指令 sudo yum nginx -y --downloadonly --downloaddir=/tmp/nginx

    yum 會將相依套件一次下載到本機指定目錄。
  2. 使用 tar zcvf nginx.tgz /tmp/nginx 打包上傳到目的主機解開
  3. sudo yum localinstall nginx-1.16.1-1.el7.x86_64.rpm 即可安裝,但我遇到很麻煩的套件相依問題:安裝 nginx 前需先裝 nginx-all-modules,要裝 nginx-all-modules 則需要先裝 nginx-mod-stream,要裝 nginx-mod-stream 卻要求得先裝好 nginx。登楞! 出現迴圈,無解。
  4. yum 有 --exclude=packageName 、--skip-broken 兩個與相依性有關的參數可用,但實測都無法忽略缺少相依套件錯誤。
  5. 查到 rpm -ivh --nodeps --force nginx-1.16.1-1.el7.x86_64.rpm 可以無視依賴關係強迫安裝。參考

最後我寫了批次檔,對下載回來的每個套件都跑一次 rpm -ivh --nodeps --force,總算裝好 Nginx,感動!

折騰半天,收獲是再累積一些冷門經驗。

Tips of installing Nginx on CentOS/RHEL without Internet connection.


Comments

# by Joker

黑大真的什麼都要碰耶,請收下膝蓋

# by Jeffrey

to Joker, 吾老仍賤,故多能鄙事 Orz

# by Fiurther

rpm喔,小錯字,好奇問一下如果用光碟會不會快一點

# by Jeffrey

to Fiurther, 指 RHEL/CentOS 安裝光碟嗎?用它架個 Local Yum Repository 可省掉不少事,但不少套件不在收錄範圍(例如 Ngnix 就沒有),還是常需要從網路取得。

# by 偷你

好奇請問 sudo yum nginx -y --downloadonly --downloaddir=/tmp/nginx 雖然會下載Nginx跟相依套件,但感覺是依照「該電腦的套件狀況」而下載 所以才會出現A電腦下載套件,結果移到B電腦安裝仍出現相依性地獄問題 老實說,我以前也遇到類似的問題 我最笨的方法就是找個電腦或是建個VM安裝相同版本的RHEL(安裝時選擇minimal mode) 然後再用像 sudo yum nginx -y --downloadonly --downloaddir=/tmp/nginx 這類指令下載 此時因為環境很乾淨,比較少套件 所以會下載更多的相依套件,避免移到B電腦安裝時出現相依性地獄問題

# by Mike

一個方法是匯出目標機器的rpm清單, 做出一個套件環境相同的模板機 例如: (目標機) rpm -qa --qf='%{NAME}.%{ARCH}' | sort > list 把list 複製到模板機 (模板機) cat list | xargs yum install -y 再從模板機上做yum --downloadonly的動作. 但如果目標機有額外的repository, 就會麻煩一點 還有這無法解決循環相依的問題...

# by 鳥毅

每個作業系統設定都不同,黑大可以試著用Docker最省事

# by pokai

謝謝黑大, 我把心得寫一下, 希望有幫助. sudo yum nginx -y --downloadonly --downloaddir=/tmp/nginx 應加個 install , sudo yum install nginx -y --downloadonly --downloaddir=/tmp/nginx 之後, 我切換到 /tmp/nginx , 用 sudo yum localinstall *.rpm , 就都可以成功 以上是我試驗結果, 提供參考

# by Jeffrey

to pokai, 讚! 能一次搞定省事多了,謝謝分享。

Post a comment