Select Page

讓 www-data 執行 SERVER 上的特定權限指令

sudoers 檔案控制了使用者及群組在使用 sudo 指令時的權限。為了安全編輯這個檔案,應該使用 visudo 指令,因為它會檢查語法錯誤,避免創建一個無法使用的 sudoers 檔案。

更新 sudoers 檔案的步驟:

開啟終端機

開啟你的伺服器的命令行介面。

使用 visudo 編輯 sudoers 檔案: 輸入以下指令以安全方式編輯 sudoers 檔案:

sudo visudo

新增規則

在編輯器中,新增一條規則,允許 www-data 使用者無需密碼執行特定指令。

www-data ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /path/to/nginx/cache/*

指令的意義是:

www-data:指定的使用者。

ALL=(ALL):這表示 www-data 使用者可以從任何主機以任何使用者身份執行指令。

NOPASSWD:允許 www-data 使用者在執行指定的指令時不需要輸入密碼。

/usr/bin/rm -rf /path/to/nginx/cache/*:指定 www-data 使用者無密碼可以執行的指令。

儲存並退出編輯器

如果你使用的是 nano,按 Ctrl+X 來退出,然後按 Y 鍵儲存更改,最後按 Enter 鍵確認檔案名稱。

測試配置

為了確保設定正確無誤,可以用 www-data 份執行指令:

sudo -u www-data sudo /usr/bin/rm -rf /path/to/nginx/cache/*

如果不需要密碼且指令執行成功,代表 sudoers 檔案配置正確。

安全注意事項:

  • 最小權限原則:只授權必要的最小權限,避免給予 www-data 使用者太廣泛的權限。
  • 明確指令路徑:使用完整的指令路徑(如 /usr/bin/rm),避免安全風險。
  • 定期審計:定期檢查 sudoers 檔案,確保所有條目仍然符合組織的安全政策和操作需要。

Nginx proxy_cache 進階設定,放飛你的 wordpress 主機

定義 proxy cache path

先找到設定檔,通常在

sudo nano /etc/nginx/nginx.conf

找到 http ,在他的配置中設定

http {
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    ...
}


緩存配置

  • 緩存文件儲存的路徑: /path/to/cache
  • 緩存目錄的層級: 1:2
  • 緩存區域的名稱和大小: my_cache:10m
    • 緩存區域名稱: my_cache
    • 緩存區域大小: 10MB
  • 緩存的最大大小: 10GB
  • 在指定的時間內沒有被訪問的緩存文件將被刪除: 60m
  • 直接在緩存路徑上操作,而不是使用臨時路徑: off

詳細說明

  • 緩存文件儲存的路徑

緩存文件將儲存在指定的目錄中。您可以根據您的需求設置此路徑。

  • 緩存目錄的層級

此設置控制緩存目錄的層級結構。例如,設置為 1:2 表示將使用兩個層級的目錄來儲存緩存文件。第一層級將包含 10 個子目錄,第二層級將包含 100 個子目錄。

  • 緩存區域的名稱和大小

此設置控制緩存區域的名稱和大小。緩存區域是緩存文件的分組。您可以根據您的需求設置多個緩存區域。

  • 緩存的最大大小

此設置控制緩存的最大大小。超過此大小時,最舊的緩存文件將被刪除。

  • 在指定的時間內沒有被訪問的緩存文件將被刪除

此設置控制在指定的時間內沒有被訪問的緩存文件將被刪除。

  • 直接在緩存路徑上操作,而不是使用臨時路徑

修改設定檔,配置 proxy cache

找到 config 中的 server ,在裡面添加相關設定

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://your_backend_server;
        proxy_cache my_cache;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 1;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
    }
}

反向代理配置

  • 後端伺服器的地址: proxy_pass
    • 此設置指定後端伺服器的地址。後端伺服器是 Nginx 將請求轉發到的伺服器。
  • 使用之前定義的緩存區域: proxy_cache
    • 此設置指定要使用的緩存區域。緩存區域是 Nginx 用於儲存靜態內容的區域。
  • 啟用後,會在緩存過期時向後端伺服器驗證緩存內容是否仍然有效: proxy_cache_revalidate
    • 此設置控制是否在緩存過期時向後端伺服器驗證緩存內容是否仍然有效。默認情況下,Nginx 將在緩存過期時直接使用緩存內容。
  • 在緩存內容之前,請求必須達到指定的次數: proxy_cache_min_uses
    • 此設置控制在緩存內容之前,請求必須達到指定的次數。這可以防止頻繁更新的內容被緩存。
  • 在後端伺服器錯誤或超時時,使用舊的緩存數據: proxy_cache_use_stale
    • 此設置控制在後端伺服器錯誤或超時時是否使用舊的緩存數據。默認情況下,Nginx 將在後端伺服器錯誤或超時時向客戶端返回錯誤。
  • 在更新緩存內容時,防止多個請求同時向後端伺服器發送: proxy_cache_lock
    • 此設置控制在更新緩存內容時是否防止多個請求同時向後端伺服器發送。這可以防止後端伺服器過載。
  • 設定不同響應狀態碼的緩存時間: proxy_cache_valid
    • 此設置控制不同響應狀態碼的緩存時間。您可以根據您的需求設置不同的緩存時間。

重新開啟 Nginx 讓設定生效

sudo nginx -t
sudo systemctl reload nginx

快取的時間設定

Nginx 支持多種時間單位来指定 cache 的有效期,这包括:

  • s
  • m 分鐘
  • h 小時
  • d
  • w
  • M 月(30 天)
  • y 年(365 天)

舉例子

快取檔案 30 秒

proxy_cache_valid 200 302 30s;

刪除快取的方法

1.直接刪除快取檔案

找到你設定的路徑,直接刪除檔案即可

sudo rm -rf /path/to/cache/*

2.使用 Nginx Cache Purge

如果你在編譯 Nginx 有加入 cache purge ,就可以用下面的設定,如果你是用預設安裝,通常不包含 cache purge,可以看下我之前的安裝教學

location /purge_cache/ {
    proxy_cache_purge my_cache $scheme$host$request_uri;
}

WordPress 性能優化:使用 NGINX FastCGI Cache 提高頁面加載速度

在許多 WordPress 網站運營者的心中,提升網站載入速度始終是一項持續的任務。快速的載入速度不僅能改善用戶體驗,降低跳出率,還能在搜索引擎優化(SEO)上取得更好的成績。本文將引導您如何通過配置 NGINX 的 FastCGI Cache 來提升您的 WordPress 網站載入速度。

為什麼選擇 NGINX 的 FastCGI Cache?

NGINX 作為一款高效能的 Web 伺服器,其 FastCGI Cache 功能可以對動態內容(如 WordPress 生成的頁面)進行快取,從而減少對後端伺服器的請求,提高頁面載入速度。與其他快取方法相比,FastCGI Cache 直接在 Web 伺服器層面進行操作,能更精確地控制快取內容及其有效期。

步驟一:設定快取儲存路徑

建立快取存放的路徑,注意目錄擁有者是 www-data

sudo mkdir -p /etc/nginx/cache
sudo chown -R www-data:www-data /etc/nginx/cache

下面的設定是放在記憶體中的設定,如果你想要把快取放在記憶體內,要用下面這一個

sudo mkdir -p /var/run/cache/nginx
sudo chown -R www-data:www-data /var/run/cache/nginx

首先,您需要在 NGINX 配置文件中指定快取的儲存路徑及其他相關參數。打開您的 NGINX 配置文件(通常位於 /etc/nginx/nginx.conf),並添加以下配置:

http {
    ...
    fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=WORDPRESS_CACHE:100m inactive=60m max_size=256m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    ...
}

這段配置創建了一個名為 WORDPRESS_CACHE 的快取區域,並將其儲存路徑設定為 /etc/nginx/cachelevels=1:2 定義了目錄結構,keys_zone 指定了快取鍵的儲存空間大小,1 MB 的記憶體大約可以存放八千個左右的鍵值,也就是說若設定為 16 MB 的話(16m),大約可以快取 128,000 個左右的網址,max_size 是設定快取檔案的總容量上限(也就是放在 /etc/nginx/cache 中的檔案大小上限),inactive=60m 表示如果快取內容在60分鐘內未被訪問,則會被自動清除。

步驟二:啟用 FastCGI Cache

接下來,在處理 PHP 請求的 location 塊中啟用 FastCGI Cache。這通常在您站點的伺服器配置中(例如 /etc/nginx/sites-available/yourdomain.com):

server {
    ...
    set $skip_cache 0;

	# POST 請求不用快取
	if ($request_method = POST) {
    	set $skip_cache 1;
  	}

  	# 若有 query 參數的網址不用快取
  	if ($query_string != "") {
      	set $skip_cache 1;
  	}

  	# 特殊的網址不用快取
  	if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
      	set $skip_cache 1;
  	}

  	# 已登入使用者、留言者不用快取
  	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
      	set $skip_cache 1;
  	}
    
    #正在維護模式中也略過
	if (-f "$document_root/.maintenance") {
    	set $skip_cache 1;
	}

  	# 加入快取資訊表頭(除錯用)
  	add_header X-Cache $upstream_cache_status;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
    	include fastcgi.conf;
        
        # FastCGI 快取設定
        fastcgi_cache WORDPRESS_CACHE;
        fastcgi_cache_valid 200 301 302 1d;
        fastcgi_cache_bypass $skip_cache;
    	fastcgi_no_cache $skip_cache;
        
        # 可以加入除錯用的標頭
        add_header X-Cache "$upstream_cache_status From $host";
    	add_header Cache-Control  max-age=0;
    	add_header Nginx-Cache "$upstream_cache_status";
    	add_header Last-Modified $date_gmt;
    }
    ...
}

這裡,fastcgi_cache 指令啟用了快取,並指定使用前面創建的快取區域。fastcgi_cache_valid 200 60m 表示成功的響應(HTTP 200 狀態碼)將被快取60分鐘。

步驟三:細化快取規則

為了避免快取敏感內容或確保特定條件下的頁面不被快取,您可以進一步細化快取規則。例如,避免快取已登入用戶的內容:

fastcgi_cache_bypass $cookie_user_logged_in;
fastcgi_no_cache $cookie_user_logged_in;

這些指令確保當 user_logged_in cookie 存在時,快取將被繞過。

清除快取

利用指令清除所有的快取

rm -rf /path/to/your/nginx/cache/*

利用 API 清除快取

首先去取 nginx 的 config 檔案中加入以下設定

location /purge_cache/ {
    allow 127.0.0.1; # 允許本地
    allow '多個主機ip';
    deny all; # 拒绝其他所有请求
    fastcgi_cache_purge WORDPRESS_CACHE $scheme$request_method$host$request_uri;
}

接下來就可以安裝 Nginx Helper 或是透過呼叫API網址清除快取

curl -X GET http://your-domain.com/purge_cache/the_uri_to_purge

區分手機版本和電腦版本

map $http_user_agent $is_desktop {
    default 0;
    ~*linux.*android|windows\s+(?:ce|phone) 0; # exceptions to the rule
    ~*spider|crawl|slurp|bot 1; # bots
    ~*windows|linux|os\s+x\s*[\d\._]+|solaris|bsd 1; # OSes
}

## Revert the logic.
map $is_desktop $is_mobile {
    1 0;
    0 1;
}
add_header x-ua-device $is_mobile;

# cache key 要加入 is_moubile
fastcgi_cache_key "$scheme$request_method$host$request_uri$is_mobile";

將快取放在記憶體,開機要自動執行

若是你把快取得存放路徑設定在記憶體中 /var/run ,那要記得設定重開機自動要建立該目錄,並且讓nginx重生效才行

先建立一個執行檔,執行重開機的設定

nano start-fastcgi.sh
chmod +x start-fastcgi.sh

start-fastcgi.sh的內容如下

mkdir -p /var/run/cache/nginx
chown -R www-data:www-data /var/run/cache/nginx
systemctl restart nginx

建立開機自動執行檔

sudo nano /etc/rc.local

rc.local 內容如下

#!/bin/bash
bash /home/yourname/start-fastcgi.sh

exit 0

設定開機自動執行

如果之前完全沒有設定過開機自動執行,那你會需要先設定開機自動執行的環境

rc-local 創建一個 Systemd 單元文件

sudo nano /etc/systemd/system/rc-local.service

將以下內容添加到文件中:

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

啟用並啟動服務

現在您有了一個為 rc-local 正確配置的 systemd 服務文件,您可以啟用並啟動它:

sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service

常見問題

無法使用 purage_all 功能,可以重新編譯 Nginx ,加入參數 –add-module=/path/to/src/ngx_cache_purge-2.3.1

Nginx Helper 的替代 Nginx FastCGI Cache

MySQL, MariaDB, 整個資料庫的複製方法

如果你想一次複製所有的資料,包括用戶數據和結構,你可以使用以下方法:

1.使用 mysqldump 進行完整備份:

mysqldump 可以用來備份整個 MariaDB 數據庫,包括資料表結構和數據。以下是備份和還原的步驟:

首先到原始主機上

mysqldump -u root -p --all-databases > full_backup.sql

這時候你會取得 full_backup.sql 檔案,將此檔案複製到目標主機上頭

並且到目標主機上做還原的動作

mysql -u root -p < full_backup.sql

2.用外部程式直接複製 MariaDB 資料庫

可以用 Percona XtraBackup , 安裝方法可以看 https://docs.percona.com/percona-xtradb-cluster/8.0/apt.html#prerequisites

備份指令如下:

innobackupex --user=root --password=your_password /path/to/backup_directory

還原指令如下

innobackupex --copy-back /path/to/backup_directory

3.複製用戶資訊

備份以及還原完資料後,要記得把用戶資料也都一起複製過來,首先用 root 或是管理員等級的帳號登入,並且下面的執行指令,把用戶資訊匯出

mysqldump -u root -pYourPassword -R --databases mysql > user_backup.sql

注意 -p 後面直接跟著密碼,中間不能有空格。

還原用戶資訊

SOURCE /path/to/user_backup.sql;

結論

這將在新主機上創建與原始主機相同的用戶帳號、密碼和許可權,以及把之前的所有資料複製到新主機上面。請確保新主機上的 MariaDB 版本與原始主機上的版本相容,並且新主機的網絡設置和防火牆規則允許用戶連接。

參考資訊

突破 Nginx proxy_pass 上傳檔案大小的限制

Nginx 配置中的 client_max_body_size 參數會限制通過 HTTP 或 HTTPS 請求傳輸的最大消息體積。這個參數對所有客戶端請求體的大小都有影響,包括由 proxy_pass 轉發的文件上傳。

如果 client_max_body_size 沒有在 Nginx 配置中明確設定,則默認值通常是 1MB,這可能導致大於 1MB 的文件上傳失敗。若要允許更大的文件上傳,你需要在 Nginx 的 serverhttp 上下文中增加這個指令並設置一個足夠的值,

例如:

http {
    ...
    client_max_body_size 100M;
    ...
}

或者在特定的 serverlocation 區塊中設定:

server {
    ...
    client_max_body_size 100M;
    ...
}

修改後,記得重新載入或重啟 Nginx 使設定生效:

sudo nginx -t
sudo nginx -s reload
sudo systemctl restart nginx

這樣就可以讓使用者上傳超過1MB的檔案了

Windows 設定 MariaDB Master to Master 備援:全面指南

Windows 設定 MariaDB Master to Master 備援:全面指南

1. 瞭解 MariaDB Master to Master 備援的重要性

Master to Master (M2M) 備援在 MariaDB 中是非常重要的一種設定。它允許兩個 MariaDB 伺服器雙向地同步資料,確保其中一台伺服器發生問題時,另一台可以立即接手,確保資料的持續可用性。對於那些尋求高可用性和資料完整性的應用程式來說,這是一個非常有用的設定。

2. Windows 環境下的 MariaDB 安裝步驟

要在 Windows 上設定 M2M,首先需要正確地安裝 MariaDB。下載適用於 Windows 的 MariaDB 版本並執行安裝程式。選擇適當的安裝選項,例如伺服器位置、資料庫大小等。並且確保在安裝過程中設定一個強大的 root 密碼,以確保資料庫的安全。

Windows MariaDB Server Download

目前MariaDB長期支援版本為 MariaDB 10.11 版本,11版本則是有最佳化過的,兩者都可以用,可以依照自己的需求做選擇

假設兩台主機如下

  • Hostname: Master01 ,IP:192.168.0.10
  • Hostname: Master02 ,IP:192.168.0.11

3. 配置 Master to Master 備援

設定 M2M 備援涉及許多步驟:

修改 my.ini(Windows) 或 my.cnf(Linux) 設定檔,設定 server-id 和 log-bin 參數

可以在開始功能表中找到my.ini,或是到你安裝時候填寫的資料庫路徑中可以看到my.ini檔案

每個 master 伺服器應該有一個唯一的 server-id,所以要在my.ini設定檔案中加入 server-id、log-bin、log-basename

第一台主機 id 設定為 1

[mysqld]
datadir=C:/Mariadb
port=3306
innodb_buffer_pool_size=2559M
character-set-server=utf8mb4

server-id = 1
log-bin
log-basename = master01

第二台主機 id 設定為 2

[mysqld]
datadir=C:/Mariadb
port=3306
innodb_buffer_pool_size=2559M
character-set-server=utf8mb4

server-id = 2
log-bin
log-basename = master02

在每台伺服器上建立用於備援的使用者帳號,並授予該使用者適當的權限。

在第一台主機 master01 上,新增一個使用者,讓 slave 主機可以透過192.168.0.X的網段連進來

grant replication slave on *.* to 'replica_user'@192.168.0.% identified by '123456';
flush privileges;

在第二台主機 master02 上,新增一個使用者,並且要讓 master01 主機的 IP 可以連進來

grant replication slave on *.* to 'replica_user'@192.168.0.% identified by '123456';
flush privileges;

設定 replication filters,確保只有需要的資料被同步。

啟動二進制日誌(binary logging)並確認每台伺服器都可以互相連接。

4. 測試 Master to Master 備援

在完成設定後,你應該測試 M2M 備援以確保它正常工作。首先,在一台伺服器上添加或修改一些資料,然後檢查另一台伺服器是否已同步這些變更。同樣地,從另一台伺服器修改資料並檢查第一台伺服器。此過程應確保資料在兩個伺服器之間正確同步。

在 Master01 中,查詢 File 和 Position,並且把值記錄下來,等等要填到 master02

show master status;

在 master02 中,把 master01 的數值填入,並且建立連結

change master to master_host='192.168.0.10',
    -> master_user='replica_user',
    -> master_password='123456',
    -> master_log_file='master01-bin.000001',
    -> master_log_pos=5099;

start slave;

接下來檢查是否有設定成功

show slave status;

接下來回到 master01 去設定跟 master02 的連接

change master to master_host='192.168.0.11',
    -> master_user='replica_user',
    -> master_password='123456',
    -> master_log_file='master02-bin.000002',
    -> master_log_pos=5079;

start slave;

5. 維護和監控 Master to Master 備援

一旦 M2M 備援設定完畢並經過測試,你需要持續監控以確保它正常運作。使用如 MariaDB 的 SHOW SLAVE STATUS 命令來檢查備援的狀態。此外,考慮使用監控工具,如 Nagios 或 Zabbix,來自動檢查伺服器的健康狀態。

相關文章