nginx 反向代理wordpress容器,出現failed (111: Connection refused) while connecting to upstream

系統大概長這樣,一個RockyLinux 9.2 主機安裝 iRedMail 1.6.3版(容器還在Beta版),iRedMail安裝滿簡單的,很快就搞定;但因為太霸氣應改主機的nginx設定,並且深度修改,若這主機只當mail server倒是沒問題,但可惜因為種種原因需要再安裝一個wordperss容器,這就麻煩了,我得了解如何讓nginx使用反向代理方式(proxy),才能連到wordpress,nginx反向代理設定似乎很簡單,也成功了,可惜log卻一直跳出錯誤:

connect() failed (111: Connection refused) while connecting to upstream

我祭出google大神,試了很多建議與解法卻失敗了,就在第9999次嘗試之後,突然意識到甚麼,將設定改了一下,只是簡單的將原本連到容器的方式 http://127.0.0.1:8080 改成該具名稱連線 http://www.test.com:8080 (該wordpress容器對外連結為https://www.test.com),錯誤訊息居然就停止了,真是神奇。

proxy_pass http://127.0.0.1:8080;
改成以下具名設定
proxy_pass http://www.test.com:8080;

算一算農曆七月快到了,就當作是靈異事件好了。

安裝wordpress(容器)掛載在子網址(目錄)

安裝wordpress這麼多次,第一次遇到掛載子目錄的需求,也就是安裝完畢,透過反向代理程式,網址看起來像這樣:

https://xxx.xxx.xxx/subfolder

一樣感謝google, 我爬了很多文,說法很多,自己覺得修改檔案這方式很靠譜(非透過web設定)可以避免掛載正式網址時候,若因錯誤很難進入網址改或是到資料庫研究要改哪個table

1.、修改 wp-config.php

 define('WP_SITEURL', 'https://你的網站名稱/你的子目錄');
 define('WP_HOME', 'https://你的網站名稱/你的子目錄');
 #以下是可以不使用ftp就安裝外掛
 define('FS_METHOD', 'direct');

2、修改.htaccess (與wp-config.php都是在wordpress根目錄)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /你的子目錄/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /你的子目錄/index.php [L]
</IfModule>

3、nginx反向代理

 location /你的子目錄 {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_headers_hash_bucket_size 128;
    proxy_pass http://容器ip(通常127.0.0.1):port/你的子目錄;
  }

4、apache 反向代理

等待遇到實例

Rocky Linux 安裝httpd 反向代理

真是被selinux搞死,但,咱們工程師, 就是要勇往直前

RL9 安裝httpd後, 若要啟用proxy , reverse 功能 , 目前我遇到要改兩點

  • 修改httpd設定, 把心跳這一行mark起來
    vi /etc/httpd/conf.modules.d/00-proxy.conf
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
  • selinux 啟用連線功能
sudo setsebool -P httpd_can_network_connect 1
#2023/6/20 否則會出現 Permission denied: AH00957 錯誤

httpd reverse proxy 需要注意的設定

一般來說有些需要保護的web service,可以躲到httpd proxy背後, 好處如下:

  1. 比較安全, 尤其是老舊的web service,
  2. 統一由httpd proxy 保管SSL證書很方便

這些在背後的service 通常只要讓httpd proxy 知道該service本地端的ip&port 就能存取, 並且晉升https的行列,非常方便.
基本上調整如下:

 <VirtualHost *:443>
 ServerName  xxx.yyy.com
 ErrorLog /var/log/httpd/ssl_error_log1
 TransferLog /var/log/httpd/ssl_access_log1
 
 SSLEngine On
 SSLProxyEngine On
 SSLCertificateFile /etc/letsencrypt/live/xxx.yyy.com/cert.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/xxx.yyy.com/privkey.pem
 SSLCACertificateFile /etc/letsencrypt/live/xxx.yyy.com/fullchain.pem
 

 ProxyPass / http://zzz.yyy.com.tw:80/
 ProxyPassReverse / http://zzz.yyy.com:80/
 </VirtualHost> 

以上設定若是遇到網址是%2F, 通常都會出問題,
這是slash html encode的問題, apache預設不支援該編碼, 因此可以加上 AllowEncodeSlashesnocanon

<VirtualHost *:443>
AllowEncodedSlashes on
ProxyPass / http://zzz.yyy.com.tw:80/ nocanon
ProxyPassReverse / http://zzz.yyy.com:80/ nocanon
</VirtualHost>

使用docker安裝nextcloud

新版安裝方式請到這裡查看

——————-以下是舊版安裝方式——————-

  1. 建立volume
  2. 設定mariadb data
  3. 執行
  4. 設定trusted_domain

建立volume

 docker volume create nextcloud-www
 docker volume create nextcloud-app
 docker volume create nextcloud-config
 docker volume create nextcloud-data
 docker volume create nextcloud-theme 

確認 mariadb 資料庫伺服器是否準備好

執行docker指令

docker run -d -p <對應的port>:80 -v nextcloud-www:/var/www/html -v nextcloud-app:/var/www/html/custom_apps -v nextcloud-config:/var/www/html/config -v nextcloud-data:/var/www/html/data -v nextcloud-theme:/var/www/html/themes/mycustom --link <docker資料庫名稱>:mysql -e MYSQL_DATABASE=nextcloud -e MYSQL_USER=root -e MYSQL_PASSWORD=<密碼> -e MYSQL_HOST=mysql --restart=always --name nextcloud nextcloud 

若有apache或是nginx作為反向proxy, 將https帶到nextcloud, 需設定trust_domain(網站會提醒)

httpd設定

# for CalDav
RewriteEngine On 
RemoteIPHeader X-Forwarded-For
RewriteRule ^/\.well-known/carddav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L] RewriteRule ^/\.well-known/caldav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L] 
# form redirect
<VirtualHost *:80>
    ServerName <server name>
    Redirect permanent / https://<server name>/
</VirtualHost>

<VirtualHost *:443> 
  # form security
  <IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
  </IfModule>
</VirtualHost>

nextcloud config設定

若使用httpd proxy 的方式需要加入以下設定, 以免登入轉圈圈無法進入頁面, 修改 config.php 檔案

'overwritehost' => '<主機名稱>',
'overwriteprotocol' => 'https',

執行command

 docker exec --user www-data <CONTAINER_ID> php occ 
例入遇到上傳檔案失敗, 或是一些檔案錯誤可執行
docker exec --user www-data <container id> php occ files:scan --all

ubuntu 安裝shadowsocks用戶端程式

之前咖啡偶提到如何在docker安裝shadowsocks 伺服器 , 這次就來個如何在ubuntu 安裝shadowsocks用戶端程式, 這樣就可以技術翻牆囉

方法一:

1.安裝套件

sudo apt-get install python-pip
sudo apt-get install python-setuptools m2crypto
sudo pip install shadowsocks

2.執行

sslocal -s <ss server ip> -p <ss server port> -k "<password>" -l <local port> -t 600 -m aes-256-cfb

方法二:

1.安裝套件

sudo apt update
sudo apt install shadowsocks-libev

2.執行

ss-local -s <ss server ip> -p <ss server port> -k "<password>" -l <local port> -t 600 -m aes-256-cfb

方法一與方法二可用檔案的方式紀錄

sslocal -c xxx.json -v -u 或是 ss-local -c xxx.json -v -u

xxx.json

{
  "server": "yourip",
  "server_port": your port number,
  "local_address": "127.0.0.1",
  "local_port": "local port",
 "password": "your password",
  "timeout": 300,
  "method": "aes-256-cfb",
  "fast_open": true,
  "prefer_ipv6": false
}

瀏覽器設定

瀏覽器安裝plugin, 請到這裡找對應的安裝, 有chrome與firefox
https://github.com/FelisCatus/SwitchyOmega/releases/
咖啡偶使用socks5, 花點時間研究一下安裝與設定就好了

docker環境建立須知

本篇文章提供建立docker環境時, 所需要的步驟以及注意事項!

往後本站使用docker安裝之相關教學文件, 亦以本篇為基礎建設文章.

安裝docke所建議之母體作業系統為 CentOS 7.x , 以及 apache httpd 2.4.x 網站反向代理伺服器!

(1) 10002_(CentOS)如何安裝docker套件.txt

(2) 10007_(CentOS)如何取得LetsEncrypt加密證書.txt

(3) 10004_(CentOS)apache httpd代理內部伺服器(proxy).txt

(4) 10012_(Docker)如何安裝mariadb資料庫.txt

網站維護的管理策略

網站, 終究面臨資訊安全的問題

咖啡偶提供簡單的管理策略

那就是安裝”網站代理伺服器proxy” , 任何要存取網站的行為, 都需請proxy存取真正的網站.

這樣一來, IT 只要定期更新proxy, 修補資安漏洞, 就不會因為真正的網站版本不一致或是有相容性問題, 導致後續維護困難, 例如:

老舊php 3網站,存在嚴重資安漏洞, 程式又因故無法升級,此時使用代理伺服器是好作法.

那款好用? 不外乎 apache httpd 或是 nginx

想要深入了解或安裝httpd?請參考10004_(CentOS)apache httpd代理內部伺服器(proxy).txt