西西有點東西

我只是想找個地方記錄

在 apache 前方增加 nginx proxy manager 來做反向代理

該文章分享超過 1 年,隨時都會消失或變叉燒包,請聯繫管理員處理。

前言

因為我已經利用 LAMP 安裝了 WordPress、NextCloud,並且利用 Apache 來做反向代理給 memos 做 SSL 證書,但是這樣取得 SSL 實在不是很人性化,雖然說幾個指令打一下就可以,但是當我用過 Nginx Proxy Manager 之後就回不去了,而且網路上一直說用 Nginx 作反向代理可速度是 Apache 的 2.5 倍之類的,害我實在心動……,所以乾脆來手動處理看看 Apache 前掛個 Nginx Proxy Manager 是否真的快速。

更改步驟

刪除 certbot 的任務及檔案 (可以略過)

因為之前利用 Apache 的 certbot 取得 SSL 證書,現在要利用 Nginx Proxy Manager 來取得,所以就先移除之前的設定及證書

#指令
certbot revoke --cert-name 網址名稱
#範例
certbot revoke --cert-name abc.com

此命令將吊銷證書並刪除與其鏈接的 Apache 組態。

#指令
certbot delete --cert-name 網址名稱
#範例
certbot delete --cert-name abc.com

需要注意的是,吊銷證書會使其失效,但不會從服務器中刪除證書檔案。執行 certbot delete 命令從服務器中刪除證書檔案。

修改 Apache 埠口

開啟終端機,移動到/etc/apache2,打開ports.conf編輯

cd /etc/apache2
sudo nano /etc/apache2/ports.conf
#埠口可以修正為80以外的任何埠口,我的習慣是480
Listen 480

<IfModule ssl_module>
# Listen 443 
</IfModule>

<IfModule mod_gnutls.c>
# Listen 443 
</IfModule>

修改將 Listen 80 更改為 Listen 480 ,保存並關閉文件。480可以更改為任意數字,但不要用到常用的埠口即可。然後把listen 443註解掉。

接著修改 Apache 內的 NextCloud 及 WordPress 的設定檔,我的設定檔名稱為nextcloud.confwordpress.conf

sudo nano /etc/apache2/sites-available/nextcloud.conf
sudo nano /etc/apache2/sites-available/wordpress.conf
sudo nano /etc/apache2/sites-available/000-default.conf

將內容監聽的埠口80修改為480,然後存檔。

<VirtualHost *:80>
↓↓↓↓↓↓↓↓↓↓↓
<VirtualHost *:480>

並且將所有設定檔內的有使用到 https 代理註解掉

#RewriteEngine on
#RewriteCond %{SERVER_NAME} =網址
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

我們可以禁用默認的 Apache 站點,因為 Nginx 將處理這個問題。這將避免 Apache 和 Nginx 之間出現問題:

sudo a2dissite 000-default

因為我也有用 Apache 反代理來執行 memos,所以我要先把 memos 的網站禁止

sudo a2dissite memos

並且修改/etc/apache2/apache2.conf,將Header unset Upgrade添加進去到檔案的最底部,如果不增加這個,iOS 的系統將無法連線至 NextCloud,搞了一天才終於發現解決方法

sudo nano /etc/apache2/apache2.conf
#將該指令增加至最底下存檔即可
Header unset Upgrade

重新啟動 Apache

sudo service apache2 restart

安裝 Nginx Proxy Manager

使用 Docker-Compose 來安裝很方便,打開終端機,移動到一個適當的位置創建一個 Docker-Compose.yml,將下列指令複製貼上即可。

我的習慣是將 Docker-Compose.yml 建立在大硬碟上,因為我的系統碟只有 256G 有點小,避免硬碟爆掉導致問題出現。

cd /mnt/cloud1
mkdir npm
cd npm
sudo nano /mnt/cloud1/npm/docker-compose.yml

複製貼上即可

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

開啟 Nginx Proxy Manager 的控制台頁面,通常是 IP:81,我的範例是192.168.6.7:81。進入登入畫面需要輸入預設的帳號密碼才能進去內部設定,預設帳號密碼為

Email:admin@example.com
Password:changeme

詳細設定方式參考在 iStoreOS 上安裝 memos 並利用 Nginx Proxy Manager 反向代理及簽證

設定相同埠口不同網址,就像下列圖片這樣即可。

Nginx Proxy Manager 的設定.png

NextCloud 的進階設定

NextCloud 的反代理設定除了填寫 Nginx Proxy Manager 內建的表格外,還要額外增加下列

目前是只有使用下列指令到 Nginx Proxy Manager,其他的都沒輸入

記錄時間:2023 年 09 月 23 日
location = /.well-known/carddav {return 301 $scheme://$host:$server_port/remote.php/dav;}
location = /.well-known/caldav {return 301 $scheme://$host:$server_port/remote.php/dav;}

NextCloud 內容設定

以及編輯 NextCloud 內的config.php,我的位置在/var/www/nextcloud/config/config.php:

sudo nano /var/www/nextcloud/config/config.php
'trusted_domains' =>
array (
    0 => '192.168.6.7:480', #內部ip
    1 => '網址',
),
'overwritehost' => '網址',
'overwriteprotocol' => 'https',
'overwritewebroot' => '/',
'overwrite.cli.url' => 'https://網址/',
'htaccess.RewriteBase' => '/',
'trusted_proxies' => ['Nginx Proxy Manager的虛擬IP'],
#即內部ip,我使用的是192.168.6.7

WordPress 的設定

WordPress 的反代理設定除了填寫 Nginx Proxy Manager 內建的表格外,還要額外增加下列

-->
修正 apache 內 WordPress 的內容

sudo nano /etc/apache2/sites-available/wordpress.conf

修改如下:

<VirtualHost *:480>       
        ServerName 網址
        ServerAlias 網址

        DocumentRoot /var/www/wordpress #目錄位置

         <Directory />
             Options FollowSymLinks
             AllowOverride None
         </Directory>
        #This enables .htaccess file, which is needed for WordPress Permalink to work. 
        <Directory "/var/www/wordpress"> #目錄位置
             Options Indexes FollowSymLinks MultiViews
             AllowOverride All
             Order allow,deny
             allow from all
             Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/wordpress.error.log
        CustomLog ${APACHE_LOG_DIR}/wordpress.access.log combined
#註解掉
#RewriteEngine on
#RewriteCond %{SERVER_NAME} =網址
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

存檔後重新啟動 apache

sudo service apache2 restart

接著要在 WordPress 的程式設定裡面修改,不然會無限循環重新指向,及出現ERR_TOO_MANY_REDIRECTS的錯誤

sudo nano ~/yourdomainname.com/public/wp-config.php
#範例
sudo nano /var/www/wordpress/wp-config.php

然後將下列指令輸入在<?php

define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
     $_SERVER['HTTPS']='on';

歡迎留言分享指教