

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ubuntu &#8211; Max的程式語言筆記</title>
	<atom:link href="https://stackoverflow.max-everyday.com/tag/ubuntu/feed/" rel="self" type="application/rss+xml" />
	<link>https://stackoverflow.max-everyday.com</link>
	<description>我要當一個豬頭，快樂過每一天</description>
	<lastBuildDate>Thu, 02 Apr 2026 03:53:12 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://stackoverflow.max-everyday.com/wp-content/uploads/2017/02/max-stackoverflow-256.png</url>
	<title>Ubuntu &#8211; Max的程式語言筆記</title>
	<link>https://stackoverflow.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>git push 每次都要輸入密碼鎖(passphrase)的解法</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/git-push-passphrase/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/git-push-passphrase/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 01 Apr 2026 09:17:05 +0000</pubDate>
				<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8219</guid>

					<description><![CDATA[之前產生的 SSH 金鑰有設定密碼鎖。雖然這比沒...]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="559" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/git-push-passphrase_clean-1024x559.jpg?v=1775035163" alt="" class="wp-image-8222" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/git-push-passphrase_clean-1024x559.jpg?v=1775035163 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/git-push-passphrase_clean-600x327.jpg?v=1775035163 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/git-push-passphrase_clean-768x419.jpg?v=1775035163 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/git-push-passphrase_clean.jpg?v=1775035163 1408w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>之前產生的 SSH 金鑰有設定密碼鎖。雖然這比沒設密碼安全，但每次都要輸入確實很麻煩。如果你不想重新產生金鑰，有兩個方法可以解決。</p>



<h2 class="wp-block-heading">使用 ssh-agent 自動管理</h2>



<p>這是最推薦的做法。你可以讓系統在背景跑一個代理程式，幫你記住解鎖後的金鑰。只要在 WSL 終端機執行這兩行指令：</p>



<pre class="wp-block-code"><code>eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa_personal</code></pre>



<p>執行第二行時，輸入最後一次密碼。之後只要這個視窗沒關掉，再次 push 就不會再問你密碼。</p>



<p>如果你希望每次開啟 WSL 都自動生效，可以把這兩行指令加到 ~/.bashrc 檔案的最末端。這樣每天第一次開機輸入一次，之後整天都不用再打。</p>



<h2 class="wp-block-heading">移除金鑰本身的密碼</h2>



<p>如果你覺得在私有電腦上不需要這層保護，也可以直接把金鑰的密碼拿掉。執行這行指令：</p>



<pre class="wp-block-code"><code>ssh-keygen -p -f ~/.ssh/id_rsa_personal</code></pre>



<p>系統會先要求你輸入舊密碼。接著會問你新的密碼，這時直接按兩次 Enter 留白。這樣這組金鑰就會變成無密碼狀態，以後執行 git push 就會直接通過。</p>



<h2 class="wp-block-heading">確認設定是否正確</h2>



<p>處理完密碼後，你可以測試一下連線是否正常。輸入：</p>



<pre class="wp-block-code"><code>ssh -T git@github.com -i ~/.ssh/id_rsa_personal</code></pre>



<p>如果看到 Hi 帳號名！You&#8217;ve successfully authenticated，就代表搞定了。以後不管 Windows 那邊登入哪個帳號，WSL 這邊都會走你這組專屬的 SSH 金鑰。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>如果你使用的是 zsh，要把設定寫在 <strong>~/.zshrc</strong> 這個檔案裡。</p>



<h2 class="wp-block-heading">修改設定檔</h2>



<p>你可以使用 nano 或 vim 來編輯：</p>



<pre class="wp-block-code"><code>nano ~/.zshrc</code></pre>



<p>把下面這段程式碼貼到檔案的最末端：</p>



<p>Bash</p>



<pre class="wp-block-code"><code>if &#91; -z "$SSH_AUTH_SOCK" ]; then
   eval $(ssh-agent -s)
   ssh-add ~/.ssh/id_rsa_personal
fi
</code></pre>



<p>存檔離開後，執行 <strong>source ~/.zshrc</strong> 讓設定立即生效。這樣你下次開啟新的 zsh 視窗時，系統就會自動啟動代理並載入你的金鑰。</p>



<h2 class="wp-block-heading">使用 oh-my-zsh 插件</h2>



<p>如果你有安裝 oh-my-zsh，其實有一個更優雅的插件做法。在 ~/.zshrc 找到 <strong>plugins=(&#8230;)</strong> 這行，把 <strong>ssh-agent</strong> 加進去：</p>



<pre class="wp-block-code"><code>plugins=(git ssh-agent)</code></pre>



<p>接著在下面補上一行設定，指定要自動載入的金鑰名稱：</p>



<pre class="wp-block-code"><code>zstyle :omni:plugins:ssh-agent identities id_rsa_personal</code></pre>



<p>這樣它會在你開啟終端機時自動處理一切，不用自己寫 shell script。</p>



<h2 class="wp-block-heading">解決重複啟動問題</h2>



<p>要注意的是，如果直接在設定檔寫 eval，每次開新視窗都會產生一個新的 ssh-agent 處理程序。如果你發現系統變慢，或是用 ps 指令看到一堆 ssh-agent，建議使用上面提到的 if 判斷式，或是安裝 <strong>keychain</strong> 這個套件來管理。</p>



<p>keychain 會幫你找現有的代理程序，確保整個系統只跑一個 ssh-agent。這對於習慣開多個分頁的人來說，是比較乾淨的做法。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">關於 Keychain</h2>



<p>keychain 是一個用來管理 ssh-agent 的工具。它的好處是能讓所有開啟的終端機視窗共用同一個 ssh-agent。如果不使用它，你每開一個新的 zsh 分頁，系統可能就會跑一個新的 ssh-agent 程式，久了會變得很亂。</p>



<p>keychain 會在背景記住你解鎖過的金鑰。只要你在第一次登入時輸入過一次密碼，之後不管是重開分頁還是執行 git push，它都不會再煩你。</p>



<h2 class="wp-block-heading">安裝方式</h2>



<p>在 Ubuntu 或 WSL (Ubuntu) 環境下，安裝非常簡單。直接輸入這行指令：</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt install keychain</code></pre>



<p>安裝完後，它還不會自動運作，需要去修改你的 zsh 設定檔。</p>



<h2 class="wp-block-heading">設定 zsh 自動執行</h2>



<p>你需要把啟動指令加進 <strong>~/.zshrc</strong>。請編輯該檔案：</p>



<p>nano ~/.zshrc</p>



<p>在檔案最後面加上這兩行程式碼：</p>



<p>Bash</p>



<pre class="wp-block-code"><code>/usr/bin/keychain --nogui ~/.ssh/id_rsa_personal
source ~/.keychain/$HOST-sh
</code></pre>



<p>第一行是叫 keychain 去管理你的那把金鑰。第二行則是載入相關的環境變數，讓目前的 zsh 知道要去哪裡找已經解鎖的金鑰。</p>



<h2 class="wp-block-heading">實際使用效果</h2>



<p>設定完成後，執行 <strong>source ~/.zshrc</strong> 或是重開視窗。這時候系統會最後一次詢問你金鑰的密碼。</p>



<p>輸入完畢後，這把金鑰就會一直保持在解鎖狀態。就算你開了十個 zsh 視窗，也都只需要輸入那一次密碼。這對頻繁使用 git push 的開發者來說，是最省心也兼顧安全的方法。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>在 Windows CMD 環境下，Git 每次 push 都要求輸入密碼鎖，通常是因為 SSH Agent 沒有在背景執行，或是金鑰沒有被正確載入。以下提供兩個主要的解決方案。</p>



<h3 class="wp-block-heading">使用 Windows 內建的 OpenSSH 服務</h3>



<p>這是最推薦的做法，因為它可以讓 SSH Agent 在開機時自動啟動，並持久化儲存你的金鑰密碼。</p>



<p>以管理員身分開啟 PowerShell，執行以下指令將 OpenSSH Authentication Agent 服務設定為自動啟動</p>



<pre class="wp-block-code"><code>Set-Service -Name ssh-agent -StartupType AutomaticStart-Service ssh-agent</code></pre>



<p>回到一般的 CMD 視窗，將你的私鑰加入 Agent。假設你的金鑰路徑是預設值：</p>



<pre class="wp-block-code"><code>ssh-add %USERPROFILE%\.ssh\id_rsa</code></pre>



<p>執行後系統會要求你輸入最後一次密碼鎖。之後只要服務維持執行狀態，重開 CMD 也不需要再輸入密碼。</p>



<p>執行上述指令, 錯誤訊息:</p>



<pre class="wp-block-preformatted">Error connecting to agent: No such file or directory</pre>



<p>這個錯誤通常是因為 CMD 無法識別 %USERPROFILE% 後接續的路徑格式，或是 ssh-agent 服務雖然啟動了，但目前的視窗環境變數還沒有對接上。你可以依照以下步驟排查並修正。</p>



<h3 class="wp-block-heading">修正路徑格式與環境變數</h3>



<p>在 CMD 中，路徑的分隔符號與變數引用非常嚴格。請嘗試手動補上反斜線，並加上雙引號確保路徑正確：</p>



<pre class="wp-block-code"><code>ssh-add "%USERPROFILE%\.ssh\id_rsa"</code></pre>



<p>如果依然顯示無法連線到 Agent，請在同一個 CMD 視窗內執行以下指令，手動啟動 Agent 並設定環境變數：</p>



<pre class="wp-block-code"><code>for /f "tokens=1-2 delims==;" %a in ('ssh-agent -s') do set %a=%b</code></pre>



<p>執行完畢後，再次嘗試執行 ssh-add 指令。</p>



<h3 class="wp-block-heading">確認 SSH 服務執行狀態</h3>



<p>如果手動啟動有效，但每次開新視窗都要重來，代表系統服務沒有正確常駐。請再次確認服務狀態：</p>



<ol start="1" class="wp-block-list">
<li>按下 Win + R 鍵，輸入 services.msc 並執行。</li>



<li>找到 OpenSSH Authentication Agent。</li>



<li>確認狀態為 正在執行，且啟動類型為 自動。</li>
</ol>



<p>結果是服務被停用, 啟用就好了.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="590" height="710" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/2026-04-02_11-51_n3.jpg?v=1775101951" alt="" class="wp-image-8230" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/2026-04-02_11-51_n3.jpg?v=1775101951 590w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/2026-04-02_11-51_n3-499x600.jpg?v=1775101951 499w" sizes="(max-width: 590px) 100vw, 590px" /></figure>



<h3 class="wp-block-heading">檢查 GIT_SSH 環境變數</h3>



<p>有時候安裝 Git 時會內建自家的 SSH 套件，這會干擾系統內建的 ssh-add。請檢查你的環境變數中是否有名為 GIT_SSH 的變數。如果有，請將它刪除，讓 Git 預設使用系統路徑 C:\Windows\System32\OpenSSH\ssh.exe。</p>



<p>另外，請確認你的 .ssh 資料夾內確實存在 id_rsa 這個檔案。你可以輸入 dir %USERPROFILE%.ssh 來查看檔案清單。如果你的金鑰檔名不是 id_rsa (例如是 id_ed25519)，請將指令中的檔名更換為正確的名稱。</p>



<h3 class="wp-block-heading">設定 Git 使用內建的 SSH 工具</h3>



<p>有時候 Git 會使用自己打包的 SSH 工具而不是 Windows 系統路徑下的工具，這會導致兩者金鑰紀錄不互通。你可以強制 Git 指向系統的 SSH 路徑：</p>



<pre class="wp-block-code"><code>git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe</code></pre>



<h3 class="wp-block-heading">修改金鑰設定移除密碼鎖</h3>



<p>如果你覺得維護 Agent 服務太麻煩，且確認電腦環境安全，也可以選擇直接移除私鑰的密碼鎖。</p>



<p>執行以下指令：</p>



<pre class="wp-block-code"><code>ssh-keygen -p -f %USERPROFILE%.ssh\id_rsa</code></pre>



<p>系統會先要求輸入舊密碼，當詢問新密碼時直接按兩次 Enter 留白。這樣該金鑰就會變成無密碼狀態，之後任何 Git 操作都不會再跳出輸入提示。不過請注意，這會降低金鑰外洩時的安全性。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/git-push-passphrase/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress 安裝 Redis 與 PHP 擴展</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/wordpress-redis-php/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/wordpress-redis-php/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Sat, 07 Feb 2026 03:07:34 +0000</pubDate>
				<category><![CDATA[WordPress筆記]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7757</guid>

					<description><![CDATA[在 WordPress 那台 VPS 上安裝 R...]]></description>
										<content:encoded><![CDATA[
<p>在 WordPress 那台 VPS 上安裝 Redis 伺服器以及讓 PHP 能與 Redis 溝通的擴展模組。</p>



<pre class="wp-block-code"><code># 更新套件清單
sudo apt update

# 安裝 Redis 伺服器與 PHP Redis 擴展
sudo apt install redis-server php-redis -y</code></pre>



<p>安裝完成後，確認 Redis 是否正常啟動：</p>



<pre class="wp-block-code"><code>sudo systemctl status redis-server</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">配置 Redis 記憶體限制</h3>



<p>為了防止 Redis 佔用過多系統記憶體導致主機當機，建議設定上限。編輯設定檔：</p>



<pre class="wp-block-code"><code><code>sudo nano /etc/redis/redis.conf</code></code></pre>



<p>在檔案中找到或加入以下兩行（假設分配 256MB 給快取，可根據你的 VPS 記憶體大小調整）：</p>



<p>程式碼片段</p>



<pre class="wp-block-code"><code>maxmemory 256mb
maxmemory-policy allkeys-lru
</code></pre>



<p>這代表記憶體滿了時，Redis 會自動刪除最近最少使用的舊資料。修改後重啟 Redis：</p>



<pre class="wp-block-code"><code><code>sudo systemctl restart redis-server</code></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">WordPress 設定檔調整</h3>



<p>雖然外掛會幫你處理大部分工作，但有時候需要手動在 <code>wp-config.php</code> 定義 Redis 的連線資訊，特別是如果你有特殊需求時。編輯 WordPress 根目錄下的 <code>wp-config.php</code>，在 <code>/* That's all, stop editing! */</code> 之前加入：</p>



<pre class="wp-block-code"><code>define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
// 如果這台主機上有連往不同網站，可以用這個區分快取
define('WP_CACHE_KEY_SALT', 'my_site_name_');</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">安裝與啟用外掛</h3>



<ol start="1" class="wp-block-list">
<li>登入 WordPress 後台。</li>



<li>前往 <strong>外掛</strong> -&gt; <strong>安裝外掛</strong>。</li>



<li>搜尋 <strong>Redis Object Cache</strong>（作者通常是 Till Krüss）。</li>



<li>點擊安裝並啟用。</li>



<li>前往 <strong>設定</strong> -&gt; <strong>Redis</strong>，點擊 <strong>Enable Object Cache</strong> 按鈕。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">驗證快取是否運作</h3>



<p>啟用後，你可以在後台看到 Status 顯示為 Connected。你也可以在主機終端機輸入以下指令來即時監控：</p>



<pre class="wp-block-code"><code><code>redis-cli monitor</code></code></pre>



<p>當你重新整理網頁時，終端機會瘋狂跳出 <code>GET</code> 或 <code>SET</code> 的指令，這代表 WordPress 已經成功將原本要丟給 MySQL 的負擔，轉移到 Redis 記憶體快取中了。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Redis 記憶體分配評估</h3>



<p>從你的系統負載來看，總實體記憶體只有 <strong>961Mi</strong>（約 1GB），目前已使用了 <strong>537Mi</strong>，可用空間（available）僅剩 <strong>423Mi</strong>。在這種記憶體受限的環境下，將 Redis 設定為 <strong>256MB</strong> 會有點冒險，因為這還沒計算 PHP-FPM 或是其他系統服務在流量高峰時可能增加的消耗。</p>



<p>為了確保系統穩定，不至於因為記憶體耗盡（OOM）而導致資料庫連線或 PHP 崩潰，我建議將 Redis 的 <code>maxmemory</code> 調低。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">修正後的設定建議</h3>



<p>建議先從 <strong>128MB</strong> 開始，這對於一般的 WordPress 網站來說，存放 Object Cache（如選單、文章 metadata、選項等）通常已經足夠。</p>



<p>編輯 <code>/etc/redis/redis.conf</code>：</p>



<p>程式碼片段</p>



<pre class="wp-block-code"><code># 針對 1GB RAM 的小主機建議值
maxmemory 128mb
maxmemory-policy allkeys-lru
</code></pre>



<p>這樣的設定能確保 Redis 在記憶體用滿時，會優先刪除最久沒被使用的資料，而不會導致系統當機。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">觀察可用記憶體</h3>



<p>你可以定期觀察 <code>available</code> 這一欄。如果設定 128MB 後，<code>available</code> 穩定維持在 200Mi 以上，且 Redis 的命中率很高，則可以維持現狀。如果 <code>available</code> 掉到 100Mi 以下，你就必須考慮縮減 Redis 或是 PHP-FPM 的行程數量。</p>



<p>設定完成並重啟 Redis 後，可以到 WordPress 後台的 Redis 設定頁面看目前的 <strong>Memory Usage</strong>，如果它一直沒用到 100MB，那就代表 128MB 的上限非常安全。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">查看 Redis 記憶體即時狀態</h3>



<p>你可以直接在終端機輸入以下指令，這會顯示 Redis 目前實際使用的記憶體、峰值以及目前的碎片率：</p>



<p>Bash</p>



<pre class="wp-block-code"><code>redis-cli info memory | grep -E "used_memory_human|used_memory_peak_human|maxmemory_human"
</code></pre>



<p>這條指令會讓你看到：</p>



<ul class="wp-block-list">
<li><strong>used_memory_human</strong>：目前 Redis 裡面存的資料佔了多少空間。</li>



<li><strong>used_memory_peak_human</strong>：從啟動到現在，最高曾經用到多少。</li>



<li><strong>maxmemory_human</strong>：你剛剛在設定檔限制的 128MB。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">判斷是否需要加碼記憶體</h3>



<p>在觀察一段時間後，你可以根據顯示的數據做調整：</p>



<ul class="wp-block-list">
<li><strong>如果 used_memory 經常達到 128MB</strong>：代表你的網站資料量大，Redis 正在頻繁刪除舊快取來放新資料（這稱為 Eviction）。這時連線效率會稍微下降，如果 <code>available</code> 還有剩，可以考慮調到 192MB。</li>



<li><strong>如果 used_memory 遠低於 128MB</strong>：代表 128MB 非常充足，不需要再動它。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">另一個實用的監控指令</h3>



<p>如果你想看更細節的統計資訊（例如快取命中率），可以執行：</p>



<p>Bash</p>



<pre class="wp-block-code"><code>redis-cli info stats | grep keyspace
</code></pre>



<ul class="wp-block-list">
<li><strong>keyspace_hits</strong>：從快取拿到資料的次數（越高越好）。</li>



<li><strong>keyspace_misses</strong>：快取找不到，必須跑去問 MySQL 的次數（越低越好）。</li>
</ul>



<p>如果你的命中率（Hits）遠高於遺失率（Misses），恭喜你，你的兩台 VPS 溝通效率已經因為 Redis 的加入而大幅提升，因為很多請求在 WordPress 這台就處理完了，根本不需要跨網段去吵 MySQL。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">建立 Redis 與系統監控指令腳本</h3>



<p>這個腳本會整合 Linux 剩餘記憶體、Redis 記憶體使用狀況以及快取命中率，方便你隨時檢查主機健康狀態。</p>



<p>請在 WordPress 主機執行以下步驟：</p>



<p>建立腳本檔案：</p>



<pre class="wp-block-code"><code><code>nano check_redis.sh</code></code></pre>



<p>貼入以下內容：</p>



<pre class="wp-block-code"><code>#!/bin/bash
echo "=== 系統記憶體狀態 ==="
free -h | grep -E "Mem|可用"
echo ""
echo "=== Redis 記憶體使用現況 ==="
redis-cli info memory | grep -E "used_memory_human|used_memory_peak_human|maxmemory_human"
echo ""
echo "=== Redis 快取命中統計 ==="
redis-cli info stats | grep -E "keyspace_hits|keyspace_misses"
</code></pre>



<ol start="3" class="wp-block-list">
<li>儲存離開，並賦予執行權限：<code>chmod +x check_redis.sh</code></li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">如何閱讀監控結果</h3>



<p>之後你只需要輸入 <code>./check_redis.sh</code> 就能看到結果。</p>



<ul class="wp-block-list">
<li><strong>used_memory_human</strong> 如果接近你設定的 <strong>maxmemory</strong>，代表快取空間快滿了。</li>



<li><strong>keyspace_hits</strong> 與 <strong>keyspace_misses</strong> 的比例很重要。例如命中 1000 次、遺失 10 次，代表 99% 的請求都直接在本地端處理，兩台 VPS 之間的網路負擔降低了 99%。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">進階調整建議</h3>



<p>如果你發現 <strong>keyspace_misses</strong> 很高，通常是因為 WordPress 還有許多資料沒被快取進去，或是快取時間太短。這時可以檢查 WordPress 的 Redis 外掛設定，確保 <strong>Object Cache</strong> 確實有發揮作用。</p>



<p>另外，如果這兩台主機在同機房，別忘了檢查 WordPress 連接 MySQL 的 <code>DB_HOST</code> 是不是已經改成 <strong>內網 IP</strong>，這是最直接影響延遲的物理因素。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Redis 多網站衝突問題與解決方案</h3>



<p>在同一台 VPS 上讓多個網站共用同一個 Redis 伺服器，<strong>確實會發生衝突</strong>。如果沒有特別設定，網站 A 的快取資料可能會被網站 B 讀取或覆蓋，導致登入狀態錯亂、顯示錯誤的文章內容或是後台設定被跳槽。</p>



<p>要解決這個問題，有兩種最常見且有效的方法：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">方法一：使用不同的資料庫編號（最簡單）</h3>



<p>Redis 預設提供 16 個資料庫（編號為 0 到 15）。你可以指定網站 A 使用資料庫 0，網站 B 使用資料庫 1。</p>



<p>編輯每個網站根目錄下的 <code>wp-config.php</code>，加入對應的資料庫編號：</p>



<p>PHP</p>



<pre class="wp-block-code"><code>// 網站 A 的設定
define('WP_REDIS_DATABASE', 0);

// 網站 B 的設定
define('WP_REDIS_DATABASE', 1);
</code></pre>



<p>這樣兩個網站的資料就會在 Redis 內部被隔離開來。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">方法二：使用 Cache Key Salt（最推薦）</h3>



<p>如果你的網站超過 16 個，或是想更保險一點，可以使用「加鹽」機制。這會讓 Redis 在儲存每一筆資料時，都在 key 的前面加上一段特定的前綴字串。</p>



<p>在每個網站的 <code>wp-config.php</code> 加入唯一的識別碼：</p>



<p>PHP</p>



<pre class="wp-block-code"><code>// 網站 A
define('WP_CACHE_KEY_SALT', 'site_a_name_');

// 網站 B
define('WP_CACHE_KEY_SALT', 'site_b_name_');
</code></pre>



<p>這樣即使它們都在同一個 Redis 資料庫裡，Key 的名稱也會變成 <code>site_a_name_options</code> 與 <code>site_b_name_options</code>，彼此互不干涉。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">注意事項與記憶體壓力</h3>



<p>雖然解決了衝突，但你必須注意<strong>記憶體用量</strong>。</p>



<ul class="wp-block-list">
<li><strong>加總計算</strong>：你之前設定的 <code>maxmemory 128mb</code> 是所有網站共用的總額。如果 site A 佔了 80MB，site B 佔了 60MB，總合就會超過 128MB。</li>



<li><strong>LRU 機制</strong>：當總量超過 128MB 時，Redis 會根據我們設定的 <code>allkeys-lru</code> 策略，隨機刪除所有網站中最舊的快取。這不會讓網站掛掉，但會導致兩邊的快取命中率都下降。</li>
</ul>



<p>如果你發現 <code>check_redis.sh</code> 顯示的 <code>used_memory</code> 經常卡在 128MB，建議稍微上修這個數值，或是增加 VPS 的實體記憶體。</p>



<p>需要我幫你檢查目前這台 VPS 上所有網站加起來大約佔用了多少 Redis Key 嗎？</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">查看 Redis 中各網站的 Key 數量</h3>



<p>你可以利用 Redis 的 <code>INFO keyspace</code> 指令來查看目前各個資料庫（Database）分別存了多少筆資料。如果你是使用「方法一」（不同資料庫編號）來區隔網站，這個指令最精準。</p>



<p>請執行：</p>



<pre class="wp-block-code"><code><code>redis-cli info keyspace</code></code></pre>



<p>輸出的結果會像這樣：</p>



<p><code>db0:keys=1250,expires=1200,avg_ttl=4500</code></p>



<p><code>db1:keys=850,expires=800,avg_ttl=3800</code></p>



<p>這代表 <strong>db0</strong>（網站 A）存了 1250 個 Key，而 <strong>db1</strong>（網站 B）存了 850 個。如果某個 db 的 keys 數量遠高於其他網站，代表該網站對 Redis 的依賴度最高，或是該網站的外掛/佈景產生了大量的快取資料。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">查看具體的前綴分佈</h3>



<p>如果你是使用「方法二」（Cache Key Salt），所有的 Key 都會擠在同一個 db0 裡面。這時我們可以用 <code>SCAN</code> 指令搭配 <code>grep</code> 來估算各網站的比例：</p>



<pre class="wp-block-code"><code># 查看 site_a 開頭的 key 有多少個
redis-cli --scan --pattern 'site_a_name_*' | wc -l

# 查看 site_b 開頭的 key 有多少個
redis-cli --scan --pattern 'site_b_name_*' | wc -l
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">綜合效能評估建議</h3>



<p>當多個網站併行時，請持續關注你的 <code>check_redis.sh</code> 指令。如果發現以下情況，請採取對應行動：</p>



<ul class="wp-block-list">
<li><strong>Evicted Keys 增加</strong>：執行 <code>redis-cli info stats | grep evicted_keys</code>。如果這個數字一直跳動，代表 128MB 真的不夠用了，Redis 正在被迫踢掉舊資料來塞新網站的資料。</li>



<li><strong>CPU 使用率飆升</strong>：如果 Redis 所在的 WordPress 主機 CPU 負載變高，可能是因為某些網站的快取過期時間（TTL）設太短，導致 Redis 頻繁處理寫入動作。</li>
</ul>



<p>目前你總共架設了幾個 WordPress 網站？如果超過 3 個，且平均流量不低，建議將 <code>maxmemory</code> 稍微放寬到 <strong>200mb</strong> 到 <strong>256mb</strong>，只要確保系統整體的 <code>available</code> 記憶體還有 100Mi 以上即可。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">建立多網站 Redis 統計腳本</h3>



<p>這個腳本會自動掃描 Redis 裡所有的資料庫（Database），並針對你設定的網站前綴（Salt）進行統計。這能讓你一眼看出哪個網站最佔空間。</p>



<p>建立腳本：</p>



<pre class="wp-block-code"><code><code>nano redis_sites_check.sh</code></code></pre>



<p>貼入以下內容（請根據你實際在 <code>wp-config.php</code> 設定的 <code>SALT</code> 修改 <code>SITES</code> 列表）：</p>



<pre class="wp-block-code"><code>#!/bin/bash
# 在下方的括號內填入你各個網站設定的 WP_CACHE_KEY_SALT
SITES=("site_a_name_" "site_b_name_" "site_c_name_")

echo "=== 各資料庫 Key 總數 (按 DB 編號) ==="
redis-cli info keyspace | grep "^db"

echo ""
echo "=== 各網站前綴 Key 統計 (按 SALT 區分) ==="
for prefix in "${SITES&#91;@]}"
do
    count=$(redis-cli --scan --pattern "${prefix}*" | wc -l)
    echo "網站前綴 &#91;${prefix}]: ${count} 個 Key"
done

echo ""
echo "=== Redis 強制刪除統計 (Evicted) ==="
redis-cli info stats | grep evicted_keys
</code></pre>



<p>賦予權限並執行：</p>



<pre class="wp-block-code"><code><code>chmod +x redis_sites_check.sh &amp;&amp; ./redis_sites_check.sh</code></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">如何解讀統計數據</h3>



<ul class="wp-block-list">
<li><strong>Key 數量落差大</strong>：如果某個網站有數千個 Key，而其他只有幾百個，通常是因為該網站安裝了較多外掛（如 WooCommerce、多語系外掛），或是佈景主題寫得比較肥大。</li>



<li><strong>evicted_keys &gt; 0</strong>：如果這個數字不是 0，代表你的 <code>maxmemory</code> 已經封頂，Redis 正在「丟車保帥」。只要這數字增加得很快，就建議加碼 50-100MB 的記憶體。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">最終優化小提醒</h3>



<p>由於你的主機記憶體只有 1GB 左右，跑多個網站加上 Redis 會讓記憶體非常吃緊。除了 Redis 優化，建議也要檢查兩台 VPS 之間的 <strong>Ping 值</strong>。</p>



<p>在 WordPress 主機輸入：</p>



<pre class="wp-block-code"><code><code>ping &lt;MySQL 主機內網 IP&gt;</code></code></pre>



<ul class="wp-block-list">
<li><strong>&lt; 1ms</strong>：完美，同機房內網。</li>



<li><strong>1ms ~ 10ms</strong>：普通，可能是同地區但不同機房。</li>



<li><strong>&gt; 50ms</strong>：不理想，建議考慮將兩台主機遷移到同一個機房，這比任何軟體優化都有效。</li>
</ul>



<p>如果你發現 Ping 值過高，或是想要了解如何優化 PHP-FPM 的行程數量來騰出記憶體，隨時告訴我。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">選擇建議：維持現狀使用 DB0 加前綴即可</h3>



<p>針對只有 3 個網站的情況，我建議<strong>繼續使用 DB0 並搭配 Salt 前綴</strong>，不需要刻意切換到不同的 Keyspace（DB 1, DB 2 等）。</p>



<p>主要原因有三點：</p>



<ol start="1" class="wp-block-list">
<li><strong>管理方便</strong>：從你跑出來的腳本可以看到，目前 3 個網站的 Key 總數才 3300 多個，佔用記憶體僅 <strong>7.41MB</strong>，遠低於 128MB 的上限。放在一起管理非常輕鬆。</li>



<li><strong>性能差異極小</strong>：在 Redis 中，切換 DB 並不會帶來明顯的性能提升，反而會讓你的監控腳本變複雜（需要切換資料庫才能掃描）。</li>



<li><strong>擴充性</strong>：使用前綴（Salt）是目前 WordPress 社群最主流的做法，許多自動化備份或快取清理外掛對前綴的支援度也比切換 DB 來得好。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">數據診斷與優化建議</h3>



<p>從你的 <code>redis_status.sh</code> 結果來看，有幾個有趣的發現：</p>



<ul class="wp-block-list">
<li><strong>命中率 (Hits) 表現良好</strong>：你的 <code>keyspace_hits</code> (25104) 遠大於 <code>keyspace_misses</code> (7042)，這代表大約 <strong>78%</strong> 的請求已經不需要去吵 MySQL 了，這對提升兩台 VPS 間的溝通效率非常有感。</li>



<li><strong>記憶體非常充裕</strong>：目前只用了 7.41MB，你可以放心地把這 3 個網站都跑在 Redis 上，完全不需要擔心 128MB 不夠用。</li>



<li><strong>第三個網站活性低</strong>：<code>stickerline_</code> 只有 47 個 Key，這通常代表該網站流量極低，或者 Redis Object Cache 外掛雖然啟用了，但還沒累積足夠的存取資料。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">下一個優化重點：減少 Misses</h3>



<p>雖然 78% 的命中率不錯，但如果你想進一步壓榨效能，可以觀察 <code>keyspace_misses</code>。這通常是因為：</p>



<ol start="1" class="wp-block-list">
<li><strong>快取過期</strong>：某些資料的 TTL（存活時間）設太短。</li>



<li><strong>不支援快取的查詢</strong>：某些複雜的 SQL 查詢或特定外掛（如購物車、會員中心）為了即時性會避開快取。</li>
</ol>



<p>你可以試著在離峰時段執行 <code>redis-cli monitor</code>，看看哪些 Key 經常出現 <code>MISS</code>，如果是某些特定的頁面，可以檢查該頁面的外掛設定。</p>



<p>目前你的兩台 VPS 溝通效率已經比「裸奔」狀態好很多了。需要我幫你看看 MySQL 那台主機的 <code>slow query log</code> (慢查詢日誌)，找出那些 Redis 擋不掉、且執行太慢的 SQL 指令嗎？</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/wordpress-redis-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress 與 mysql 溝通效率優化</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/wordpress-mysql-fine-tune/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/wordpress-mysql-fine-tune/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Sat, 07 Feb 2026 03:02:10 +0000</pubDate>
				<category><![CDATA[WordPress筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7755</guid>

					<description><![CDATA[網路延遲與連線優化 要提升兩台主機間的溝通效率，...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">網路延遲與連線優化</h3>



<p>要提升兩台主機間的溝通效率，首要任務是減少網路延遲。如果這兩台 VPS 位在同一個機房，請務必使用內網 IP（Private IP）進行連線，不要走公網 IP。內網傳輸不只速度快、頻寬不受限，還能省下流量費用。如果機房支援虛擬私有網路（VPC），也建議將兩者放在同一個 VPC 網段。</p>



<p>在 Linux 系統層面，可以調整 TCP 堆疊參數來優化連線回收速度。當 WordPress 頻繁讀取資料庫時，會產生大量短暫連線，透過修改 <code>/etc/sysctl.conf</code> 並開啟 <code>net.ipv4.tcp_tw_reuse</code>，可以讓系統更有效率地重複使用連線，避免因等待連線關閉導致的延遲。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">資料庫連線技術優化</h3>



<p>傳統的資料庫連線方式是每次請求都要重新握手，這會消耗大量時間。建議在 WordPress 主機端安裝並配置持久連線（Persistent Connections）。在 PHP 設定中啟用 <code>mysqli.allow_persistent</code>，或是在 WordPress 的資料庫設定中調整，讓 PHP 與 MySQL 之間維持長連線，避免反覆登入登出的開銷。</p>



<p>另外，如果資料庫查詢量極大，可以在兩台主機之間架設資料庫代理（Database Proxy），例如 ProxySQL。它可以處理連線池（Connection Pooling），將大量前端請求整合進少數幾個後端長連線，對提升高併發環境下的效率非常有幫助。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">軟體層與快取機制</h3>



<p>WordPress 預設每次載入頁面都會去資料庫撈資料，這對遠端資料庫來說負擔很大。建議安裝 Redis 或 Memcached 作為 Object Cache。當 WordPress 讀取過一次資料後，就直接存在主記憶體中，下次再有人訪問同一篇文章時，WordPress 會直接從記憶體拿資料，根本不需要跨過網路去問 MySQL 主機。</p>



<p>最後要檢查 MySQL 主機的 <code>my.cnf</code> 設定。確保 <code>bind-address</code> 綁定在內網 IP，並且檢查 <code>max_connections</code> 是否夠大。另外，如果在內網環境，可以關閉 MySQL 的 DNS 反向解析功能（在設定檔加入 <code>skip-name-resolve</code>），這能防止 MySQL 在每次連線時都去查主機名，直接提升連線反應速度。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">MySQL 主機連線優化</h3>



<p>在 MySQL 主機的設定檔（通常是 /etc/mysql/mysql.conf.d/mysqld.cnf）中，有幾個關鍵點可以調整。最重要的是關閉 DNS 反解，因為這常是導致連線延遲數秒的元兇。</p>



<p>Ini, TOML</p>



<pre class="wp-block-code"><code>&#91;mysqld]
# 禁用 DNS 反向解析，直接用 IP 驗證，速度最快
skip-name-resolve

# 增加最大連線數，避免 WordPress 併發高時被拒絕
max_connections = 500

# 調整等待逾時，避免無效的長連線佔用資源
wait_timeout = 600
interactive_timeout = 600
</code></pre>



<p>修改完畢後，記得重啟 MySQL 服務。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">WordPress 端的 Object Cache</h3>



<p>與其優化連線，不如減少連線。在 WordPress 這台 VPS 安裝 Redis，並搭配 Redis Object Cache 外掛。這樣重複的資料庫查詢結果會直接存在記憶體，減少跨主機存取 MySQL 的次數。</p>



<p>如果你使用的是 Ubuntu，可以快速安裝：</p>



<p><code>sudo apt install redis-server php-redis</code></p>



<p>安裝後在 WordPress 後台啟用外掛，並將資料庫主機地址改為內網 IP。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">WordPress 主機的重點</h3>



<p>這台主機扮演的是發起請求的角色。它會產生大量的短暫連線去詢問資料庫，因此最重要的參數是 <code>net.ipv4.tcp_tw_reuse = 1</code>。</p>



<p>由於 PHP 處理完請求後會關閉連線，這些連線在 Linux 系統中會進入 TIME_WAIT 狀態，佔用連接埠（Port）。開啟這個參數可以讓 WordPress 主機更快速地回收這些舊連線，避免在流量高峰時因為連接埠用盡而導致連線失敗或變慢。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">MySQL 主機的重點</h3>



<p>這台主機扮演的是接收請求的角色。它的壓力來自於同時要處理非常多個來自 WordPress 的連線請求，因此最重要的參數是 <code>net.core.somaxconn</code>。</p>



<p>當瞬間湧入大量查詢時，如果 MySQL 來不及處理，這些請求會先被放在系統的監聽佇列（Listen Queue）中。將這個數值調大（例如 4096），可以防止在高負載時請求被直接丟棄（Packet Drop），確保連線穩定不中斷。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">具體操作建議</h3>



<p>請在兩台主機分別執行以下步驟：</p>



<ol start="1" class="wp-block-list">
<li>編輯設定檔：<code>sudo nano /etc/sysctl.conf</code></li>



<li>將剛才提到的參數貼在檔案最末端。</li>



<li>存檔離開後執行：<code>sudo sysctl -p</code></li>
</ol>



<p>如果你之後發現資料庫主機的 CPU 負載過高，那可能就不是網路連線的問題，而是需要調整 MySQL 的 <code>innodb_buffer_pool_size</code> 等記憶體參數。</p>



<p>你想先檢查目前的網路連線狀態，看看是否有大量 TIME_WAIT 堆積嗎？</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">WordPress 主機的優化建議</h3>



<p>這台主機主要是作為 Client 端頻繁發起請求。重點在於加速連線回收與擴大發送端緩衝，避免因為連接埠（Port）回收不及導致的連線延遲。</p>



<pre class="wp-block-code"><code># 允許將 TIME_WAIT 狀態的連線重新用於新的 TCP 連線
net.ipv4.tcp_tw_reuse = 1
# 增加系統同時保持 TIME_WAIT 的最大數量
net.ipv4.tcp_max_tw_buckets = 50000
# 擴大本機暫時連接埠的範圍，增加可同時建立的連線數
net.ipv4.ip_local_port_range = 1024 65535
# 增加 TCP 傳輸與接收的緩衝區最大值（16MB）
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 增加接收封包的排隊佇列
net.core.netdev_max_backlog = 5000
# 調整虛擬記憶體交換傾向
vm.swappiness = 10
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">MySQL 主機的優化建議</h3>



<p>這台主機作為 Server 端負責接收大量併發連線。重點在於擴大監聽佇列（Listen Queue）以及優化記憶體對大型資料傳輸的處理能力，防止請求在系統層級就被丟棄。</p>



<pre class="wp-block-code"><code># 增加系統同時處理的監聽佇列上限，防止高併發連線溢出
net.core.somaxconn = 8192
# 增加接收封包的排隊佇列
net.core.netdev_max_backlog = 5000
# 擴大 TCP 緩衝區最大值，有利於大型查詢結果的傳輸
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 開啟連線重用（Server 端同樣建議開啟）
net.ipv4.tcp_tw_reuse = 1
# 增加 TCP SYN 隊列長度，容納更多等待握手的連線
net.ipv4.tcp_max_syn_backlog = 4096
# 減少快取壓力，優先使用記憶體
vm.swappiness = 10
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">套用與驗證步驟</h3>



<p>將上述內容分別複製到對應主機的 <code>/etc/sysctl.conf</code> 檔案末尾。請確保不要重複設定相同的變數，如果有重複的請以我給的新數值為主。</p>



<p>套用設定請執行：</p>



<p><code>sudo sysctl -p</code></p>



<p>驗證連線狀況：</p>



<p>你可以執行 <code>netstat -n | awk '/^tcp/ {print $6}' | sort | uniq -c</code> 來檢查目前連線狀態。如果看到大量的 TIME_WAIT 且你的連線效率還是沒提升，那我們就得從 PHP-FPM 的連線池（Pool）設定下手。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/wordpress-mysql-fine-tune/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>移除 MySQL 伺服器的步驟</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/remove-mysql-server/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/remove-mysql-server/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 05 Feb 2026 06:22:48 +0000</pubDate>
				<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7750</guid>

					<description><![CDATA[移除 MySQL 伺服器的步驟 從 VPS 移除...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">移除 MySQL 伺服器的步驟</h3>



<p>從 VPS 移除 MySQL 需要根據你的作業系統而定。大多數 VPS 使用 Ubuntu/Debian 或 CentOS/RHEL。請注意，執行這些指令會刪除資料庫軟體，如果你沒有事先備份，資料庫中的資料可能會遺失。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Ubuntu 或 Debian 系統</h3>



<p>這類系統使用 apt 進行套件管理。你需要先停止服務，然後完整移除軟體與設定檔。</p>



<p>停止 MySQL 服務：</p>



<pre class="wp-block-code"><code>sudo systemctl stop mysql</code></pre>



<p>移除所有相關套件：</p>



<pre class="wp-block-code"><code>sudo apt-get purge mysql-server mysql-client mysql-common</code></pre>



<p>清除不需要的依賴套件與快取：</p>



<pre class="wp-block-code"><code>sudo apt-get autoremove
sudo apt-get autoclean</code></pre>



<p>手動刪除殘留的資料夾（包含資料庫檔案）：</p>



<pre class="wp-block-code"><code>sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">CentOS 或 RHEL 系統</h3>



<p>這類系統通常使用 yum 或 dnf 進行管理。<sup></sup></p>



<ol start="1" class="wp-block-list">
<li>停止 MySQL 服務：sudo systemctl stop mysqld</li>



<li>移除 MySQL 套件：sudo yum remove mysql mysql-server</li>



<li>檢查是否還有殘留的相關套件：rpm -qa | grep -i mysql（如果有出現結果，請針對該套件名稱執行 yum remove）</li>



<li>刪除資料夾與設定檔：sudo rm -rf /var/lib/mysqlsudo rm /etc/my.cnf</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">檢查是否移除乾淨</h3>



<p>完成上述動作後，你可以嘗試輸入以下指令。如果系統回傳 command not found，代表移除成功：</p>



<pre class="wp-block-code"><code>mysql --version</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">清理防火牆規則</h3>



<p>如果你之前為了遠端連線開啟了 3306 埠，建議也將其關閉。以 ufw 為例：</p>



<pre class="wp-block-code"><code>sudo ufw delete allow 3306/tcp</code></pre>



<p></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/remove-mysql-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MySQL 設定為遠端連入</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/mysql-remote/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/mysql-remote/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 05 Feb 2026 06:17:48 +0000</pubDate>
				<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7746</guid>

					<description><![CDATA[查詢所有使用者帳號 在 MySQL 中，使用者資...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">查詢所有使用者帳號</h3>



<p>在 MySQL 中，使用者資訊儲存在 mysql 資料庫的 user 資料表中。你可以執行以下指令來查看系統中所有的帳號以及他們的主機位置：</p>



<p>SELECT user, host FROM mysql.user;</p>



<p>這會列出所有使用者名稱及其對應的連線主機。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">查詢特定使用者的權限</h3>



<p>如果你想查看某個特定使用者的具體權限，可以使用 SHOW GRANTS 指令。語法如下：</p>



<p>SHOW GRANTS FOR &#8216;username&#8217;@&#8217;host&#8217;;</p>



<p>例如，要查詢 root 使用者在本地端的權限：</p>



<p>SHOW GRANTS FOR &#8216;root&#8217;@&#8217;localhost&#8217;;</p>



<p>執行後，系統會回傳一串 GRANT 開頭的指令，這些指令描述了該帳號擁有的所有權限。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">查詢所有使用者的權限清單</h3>



<p>如果你的目標是快速掃描所有使用者的權限，可以直接查詢 mysql.user 表格中的權限欄位。不過這個表格欄位非常多，通常建議只選取幾個關鍵欄位：</p>



<p>SELECT user, host, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv FROM mysql.user;</p>



<p>這能讓你一眼看到哪些帳號具備基本的資料操作權限。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">查詢特定資料庫的權限</h3>



<p>有時候權限是針對特定資料庫設定的，這類資訊儲存在 mysql.db 資料表中。你可以執行：</p>



<p>SELECT user, host, db, Select_priv, Insert_priv FROM mysql.db;</p>



<p>這會顯示哪些使用者對哪些特定的資料庫擁有存取權。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">判斷帳號是否具備遠端連線權限</h3>



<p>在 MySQL 的權限機制中，一個帳號是否能連線取決於 user 表格中的 host 欄位。如果 host 欄位設定為 localhost 或 127.0.0.1，該帳號就只能從資料庫伺服器本機登入。若要從遠端 IP 連線，host 欄位必須是特定的遠端 IP 地址或是萬用字元 %。</p>



<p>你可以執行這行指令來檢查：</p>



<p>SELECT user, host FROM mysql.user WHERE host != &#8216;localhost&#8217; AND host != &#8216;127.0.0.1&#8217;;</p>



<p>如果查詢結果中 host 顯示為 %，代表該帳號可以從任何遠端 IP 位址連線。如果顯示的是特定的 IP 或主機名稱，則代表該帳號僅限從該位置連線。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">檢查 MySQL 監聽狀態</h3>



<p>除了帳號權限外，資料庫本身的網路設定也會影響遠端連線。如果 MySQL 只監聽本機介面，即使帳號 host 設定為 % 也無法連線。你可以檢查系統設定值：</p>



<p>SHOW VARIABLES LIKE &#8216;bind_address&#8217;;</p>



<p>如果結果是 127.0.0.1，代表資料庫只接受本機連線。若要接受遠端連線，這個數值通常會設定為 0.0.0.0。<sup></sup></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">確認權限細節</h3>



<p>有時候帳號雖然可以連線，但沒有進入特定資料庫的權限。你可以針對特定的遠端帳號查看其詳細定義：</p>



<p>SHOW GRANTS FOR &#8216;your_user&#8217;@&#8217;%&#8217;;</p>



<p>這會顯示該遠端帳號具備的所有權限與加密要求。如果 host 設定不是 % 而是特定 IP，請將指令中的 % 替換為該 IP。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">修改 MySQL 設定允許外部 IP 連線</h3>



<p>你的查詢結果顯示 bind_address 為 127.0.0.1，這代表 MySQL 目前被鎖定在只能接受本機連線。即使你修改了使用者權限，遠端連線依然會被系統層級阻擋。你必須先修改設定檔，通常位於 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf。</p>



<p>找到 bind-address 這一行，將它改為：</p>



<p>bind-address = 0.0.0.0</p>



<p>這代表允許所有網路介面的連線。修改存檔後，必須重啟 MySQL 服務才會生效：</p>



<p>sudo systemctl restart mysql</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">修改使用者帳號的 Host 屬性</h3>



<p>解決了系統監聽問題後，接著要處理帳號權限。你可以將現有帳號的 host 改為 %（代表任何 IP），或是針對特定 IP 進行設定。最直接的方式是使用 RENAME USER 指令：</p>



<p>RENAME USER &#8216;username&#8217;@&#8217;localhost&#8217; TO &#8216;username&#8217;@&#8217;%&#8217;;</p>



<p>如果你想保留原本的本機帳號，另外建立一個遠端帳號，可以使用 CREATE USER 並賦予權限：</p>



<p>CREATE USER &#8216;username&#8217;@&#8217;%&#8217; IDENTIFIED BY &#8216;your_password&#8217;;</p>



<p>GRANT ALL PRIVILEGES ON database_name.* TO &#8216;username&#8217;@&#8217;%&#8217;;</p>



<p>FLUSH PRIVILEGES;</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">安全性檢查與防火牆設定</h3>



<p>修改完 host 和 bind_address 後，最後一步是確認作業系統的防火牆（如 ufw 或 iptables）是否有開啟 3306 埠。</p>



<p>如果你的伺服器在雲端平台（如 AWS, Google Cloud），還需要在雲端平台的防火牆規則（Security Group）中允許 TCP 3306 埠的入站流量。建議將 % 改為特定的固定 IP，以避免資料庫暴露在公開網路中遭受攻擊。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">使用 mysql 指令連線資料庫</h3>



<p>要在終端機（Terminal）或命令提示字元（CMD）連線到 MySQL 資料庫，最基本的指令格式包含使用者名稱、密碼以及主機位置。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">本機連線方式</h3>



<p>如果你是在安裝資料庫的同一台電腦上連線，可以使用以下指令。輸入後系統會提示你輸入密碼：</p>



<p>mysql -u username -p</p>



<p>如果是要連線後直接進入特定的資料庫，可以在最後加上資料庫名稱：</p>



<p>mysql -u username -p database_name</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">遠端連線方式</h3>



<p>由於你之前檢查過 bind_address 並可能已經開放了遠端存取，連線到遠端伺服器時需要指定主機的 IP 地址或網址：</p>



<p>mysql -h 192.168.1.100 -P 3306 -u username -p</p>



<ul class="wp-block-list">
<li>-h：指定遠端伺服器的 IP 地址。</li>



<li>-P：指定連接埠（預設是 3306，若沒改過可以省略）。</li>



<li>-u：你的使用者名稱。</li>



<li>-p：代表需要密碼（不要直接在 -p 後面寫密碼，這樣會留在指令紀錄中不安全）。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">常見連線參數對照表</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>參數</strong></td><td><strong>說明</strong></td><td><strong>範例</strong></td></tr></thead><tbody><tr><td>-h</td><td>主機位址 (Host)</td><td>-h 127.0.0.1</td></tr><tr><td>-u</td><td>使用者名稱 (User)</td><td>-u root</td></tr><tr><td>-p</td><td>密碼 (Password)</td><td>-p</td></tr><tr><td>-P</td><td>連接埠 (Port)</td><td>-P 3306</td></tr><tr><td>-D</td><td>資料庫名稱 (Database)</td><td>-D my_db</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">連線成功後的常用指令</h3>



<p>連線成功後，你會看到 mysql&gt; 的提示字元。這時你可以執行以下指令來確認環境：</p>



<ul class="wp-block-list">
<li>查詢目前所在的資料庫：SELECT DATABASE();</li>



<li>切換資料庫：USE database_name;</li>



<li>列出所有資料庫：SHOW DATABASES;</li>



<li>離開連線：EXIT; 或 QUIT;</li>
</ul>



<p>如果你在連線時遇到時連線失敗（例如 Connection refused），通常是防火牆沒開或是 bind_address 尚未修改生效，需要我幫你排查連線錯誤嗎？</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/mysql-remote/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>UFW 限制特定 IP 訪問 3306</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/ufw-ip-3306/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/ufw-ip-3306/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 05 Feb 2026 05:18:03 +0000</pubDate>
				<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7739</guid>

					<description><![CDATA[設定 UFW 規則 要精確限制只有 10.130...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">設定 UFW 規則</h3>



<p>要精確限制只有 10.130.0.6 這個 IP 能夠連線到本機的 3306 埠口，請執行以下指令：</p>



<pre class="wp-block-code"><code>sudo ufw allow from 10.130.0.6 to any port 3306</code></pre>



<p>這條規則會明確指定來源（from）必須是 10.130.0.6，目標（to any）則是本機任何網路介面上的 3306 埠口。如果你有多張網卡，想限制得更嚴格，可以把 any 改成本機在該網路環境下的私人 IP。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">確認規則優先順序</h3>



<p>在 UFW 中，規則的順序非常重要。如果之前已經有過開放給所有人的規則（例如 allow 3306），新加入的特定 IP 規則可能會失效。請使用以下指令檢查：</p>



<pre class="wp-block-code"><code>sudo ufw status numbered</code></pre>



<p>請確認針對 10.130.0.6 的規則排在最前面。如果發現有其他更寬鬆的規則排在上面（例如 3306 ALLOW ANYWHERE），請使用 sudo ufw delete 加上編號將其刪除，確保防火牆只對特定 IP 放行。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">資料庫連線配置</h3>



<p>即使防火牆門開了，MySQL 或 MariaDB 如果沒有監聽正確的介面，連線依然會失敗。請檢查設定檔（通常在 /etc/mysql/mariadb.conf.d/50-server.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf）：</p>



<pre class="wp-block-code"><code>bind-address = 0.0.0.0</code></pre>



<p>如果這裡設定為 127.0.0.1，則外部 IP（包含 10.130.0.6）將無法連入，因為資料庫只接受來自 localhost 內部的連線。修改後記得重啟資料庫服務：sudo systemctl restart mysql。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">查詢 IP 位址與網路設定</h3>



<p>在 Ubuntu 中，最常用且推薦的指令是 ip addr，你可以簡寫為 ip a。這個指令會列出所有網路介面的詳細資訊。</p>



<h3 class="wp-block-heading">常用查詢指令</h3>



<p>如果你只需要快速看一眼 IP，或是需要詳細的設定資訊，可以參考以下幾種指令：</p>



<ul class="wp-block-list">
<li><strong>詳細資訊：</strong> ip addr show 或 ip a。這會顯示每個介面的 MAC 位址、IPv4、IPv6 以及運作狀態。</li>



<li><strong>精簡格式：</strong> ip -br addr。這會以一行一個介面的方式列出 IP，適合快速閱讀。</li>



<li><strong>純 IP 位址：</strong> hostname -I。這會直接印出本機目前所有的私人 IP，不含其他雜訊。</li>



<li><strong>對外公網 IP：</strong> curl ifconfig.me。如果你想知道在網際網路上的 IP，可以使用這個指令向外部伺服器查詢。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">解讀 ip addr 輸出內容</h3>



<p>當你執行 ip a 時，你會看到類似以下的內容：</p>



<p>2: enp0s3: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 &#8230;</p>



<p>link/ether 08:00:27:xx:xx:xx brd ff:ff:ff:ff:ff:ff</p>



<p>inet 192.168.1.105/24 brd 192.168.1.255 scope global dynamic enp0s3</p>



<p>valid_lft 86134sec preferred_lft 86134sec</p>



<ul class="wp-block-list">
<li><strong>enp0s3：</strong> 這是網路介面的名稱（以前常叫 eth0）。</li>



<li><strong>inet：</strong> 後面接的就是你的 <strong>IPv4 位址</strong>（例如 192.168.1.105）。</li>



<li><strong>UP：</strong> 代表該介面目前正在運作中。</li>



<li><strong>link/ether：</strong> 這是你的硬體位址（MAC Address）。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">靜態 IP 設定位置</h3>



<p>如果你想修改 IP 設定使其永久生效，Ubuntu 現在預設使用 Netplan 工具。設定檔通常存放在以下路徑：</p>



<p>/etc/netplan/</p>



<p>檔案通常是 .yaml 格式，例如 01-netcfg.yaml。編輯該檔案後，需要執行 sudo netplan apply 才能讓設定生效。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/ufw-ip-3306/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ubuntu 24 安裝 WordPress 教學</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-wordpress/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Mon, 02 Feb 2026 14:46:30 +0000</pubDate>
				<category><![CDATA[WordPress筆記]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7722</guid>

					<description><![CDATA[在 Ubuntu 24.04 上安裝 WordP...]]></description>
										<content:encoded><![CDATA[
<p>在 Ubuntu 24.04 上安裝 WordPress 需要建立 LAMP 架構，也就是 Linux、Apache、MySQL 和 PHP 的組合。以下是完成安裝的具體步驟。</p>



<h3 class="wp-block-heading">安裝 Apache 與 PHP</h3>



<p>首先更新系統軟體套件清單，然後安裝 Apache 伺服器以及 WordPress 運行所需的 PHP 組件。</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install apache2 php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip -y</code></pre>



<p>安裝完成後，Apache 會自動啟動，你可以透過瀏覽器輸入伺服器的 IP 地址來確認是否看到預設網頁。</p>



<h3 class="wp-block-heading">安裝並設定 MariaDB 資料庫</h3>



<p>WordPress 需要資料庫來儲存內容，這裡使用 MariaDB。<sup></sup></p>



<pre class="wp-block-code"><code>sudo apt install mariadb-server -y<sup></sup></code></pre>



<p>安裝後進入資料庫終端機，建立專屬的資料庫與使用者。請將下面的 password 換成你的密碼。</p>



<pre class="wp-block-code"><code>sudo mysql -u root
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;</code></pre>



<p></p>



<h3 class="wp-block-heading">下載並配置 WordPress</h3>



<p>接下來下載最新版的 WordPress 檔案並解壓縮到網頁根目錄。</p>



<pre class="wp-block-code"><code>wget <a href="https://www.google.com/search?q=https://wordpress.org/latest.tar.gz" target="_blank" rel="noreferrer noopener">https://wordpress.org/latest.tar.gz</a>
tar -xzvf latest.tar.gz
sudo cp -R wordpress/* /var/www/html/</code></pre>



<p>為了確保伺服器有權限讀寫檔案，需要更改目錄的所有權，並刪除原本的預設首頁。</p>



<pre class="wp-block-code"><code>sudo chown -R www-data:www-data /var/www/html/
sudo rm /var/www/html/index.html</code></pre>



<p></p>



<h3 class="wp-block-heading">完成安裝網頁導向</h3>



<p>現在打開瀏覽器並輸入伺服器的 IP 地址。你會看到 WordPress 的設定畫面。依照畫面提示輸入剛才建立的資料庫名稱 wordpress、使用者 wpuser 以及你設定的密碼。</p>



<p>最後設定你的網站標題和管理員帳號密碼，點擊安裝後即可進入後台。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>在 Ubuntu 24.04 上將資料庫更換為 MySQL 的步驟與 MariaDB 非常相似，主要是套件名稱的差異。</p>



<h3 class="wp-block-heading">安裝 MySQL 伺服器</h3>



<p>首先卸載可能存在的 MariaDB 並安裝 MySQL 官方套件。</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install mysql-server -y</code></pre>



<p>安裝後，MySQL 服務會自動執行。你可以執行 sudo mysql_secure_installation 來進行基本的安全性設定，例如設置密碼強度與移除匿名用戶。</p>



<h3 class="wp-block-heading">建立 WordPress 資料庫與用戶</h3>



<p>進入 MySQL 終端機進行權限設定。請注意，MySQL 8.0 以上版本對密碼安全性要求較高。</p>



<pre class="wp-block-code"><code>sudo mysql -u root</code></pre>



<p>在 MySQL 提示字元下執行以下指令，請將 password 替換成你的強密碼：</p>



<pre class="wp-block-code"><code>CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;</code></pre>



<p>這裡使用 mysql_native_password 是為了確保 PHP 的插件能順利連線，避免部分版本出現驗證錯誤。</p>



<h3 class="wp-block-heading">調整 PHP 設定與權限</h3>



<p>如果你之前已經移動過 WordPress 檔案，請確認 PHP 的 MySQL 擴充元件已安裝，這能讓 PHP 程式碼與 MySQL 通訊。</p>



<pre class="wp-block-code"><code>sudo apt install php-mysql -y
sudo systemctl restart apache2</code></pre>



<p>接著確認 /var/www/html/ 目錄下的權限是否正確，這關係到你是否能在 WordPress 後台直接安裝外掛或更新。</p>



<pre class="wp-block-code"><code>sudo chown -R www-data:www-data /var/www/html/
sudo chmod -R 755 /var/www/html/</code></pre>



<p></p>



<h3 class="wp-block-heading">完成安裝</h3>



<p>現在你可以直接訪問伺服器 IP，在資料庫主機欄位填入 localhost，並使用剛才建立的 wpuser 與密碼進行連線。如果連線失敗，通常是密碼輸入錯誤或是 mysql_native_password 設定未生效。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>在 Ubuntu 24.04 中，MySQL 預設使用 auth_socket 插件，這表示 root 使用者不需要密碼，而是透過 Linux 系統權限直接登入。如果你需要設定或修改 root 密碼，請依照以下步驟操作。</p>



<h3 class="wp-block-heading">進入 MySQL 修改密碼</h3>



<p>首先使用 sudo 權限進入 MySQL 終端機：</p>



<p>sudo mysql -u root</p>



<p>進入後，執行以下指令來修改密碼。請將 new_password 替換成你想設定的強密碼：</p>



<p>ALTER USER &#8216;root&#8217;@&#8217;localhost&#8217; IDENTIFIED WITH mysql_native_password BY &#8216;new_password&#8217;;</p>



<p>FLUSH PRIVILEGES;</p>



<p>EXIT;</p>



<p>這裡使用 mysql_native_password 是為了確保相容性，讓傳統的 PHP 程式或管理工具能順利連線。</p>



<h3 class="wp-block-heading">驗證密碼修改</h3>



<p>修改完成後，原本的 sudo mysql 指令可能無法直接登入。你需要加上 -p 參數來手動輸入密碼：</p>



<p>mysql -u root -p</p>



<p>系統會提示你輸入剛才設定的密碼，輸入正確後即可進入。</p>



<h3 class="wp-block-heading">恢復成無密碼登入</h3>



<p>如果你發現設定密碼後不方便，想換回原本透過系統權限登入（auth_socket）的方式，可以進入 MySQL 後執行：</p>



<p>ALTER USER &#8216;root&#8217;@&#8217;localhost&#8217; IDENTIFIED WITH auth_socket;</p>



<p>FLUSH PRIVILEGES;</p>



<p>這樣以後只要在終端機輸入 sudo mysql 就能直接管理資料庫。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>你可以透過以下指令來檢查目前 MySQL 所有使用者的身份驗證方式：</p>



<h3 class="wp-block-heading">檢查驗證方式</h3>



<p>請先進入 MySQL 終端機：</p>



<p>sudo mysql -u root -p</p>



<p>登入後執行這段查詢指令：</p>



<p>SELECT user, host, plugin FROM mysql.user;</p>



<figure class="wp-block-image size-full"><img decoding="async" width="824" height="362" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/02/2026-02-02_23-04_m7.jpg?v=1770044666" alt="" class="wp-image-7729" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/02/2026-02-02_23-04_m7.jpg?v=1770044666 824w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/02/2026-02-02_23-04_m7-600x264.jpg?v=1770044666 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/02/2026-02-02_23-04_m7-768x337.jpg?v=1770044666 768w" sizes="(max-width: 824px) 100vw, 824px" /></figure>



<p>你會看到一個表格，顯示每個使用者對應的 plugin 欄位：</p>



<ol start="1" class="wp-block-list">
<li>如果 plugin 顯示為 auth_socket，代表該帳號是透過 Linux 系統權限登入，不需要在 MySQL 輸入密碼。</li>



<li>如果 plugin 顯示為 mysql_native_password 或 caching_sha2_password，則代表需要使用密碼登入。</li>
</ol>



<h3 class="wp-block-heading">為什麼這很重要</h3>



<p>在 Ubuntu 24.04 上，如果你打算使用圖形化管理工具（如 phpMyAdmin）或某些舊版的外掛程式，通常需要將 root 或專用帳號的 plugin 改為 mysql_native_password，否則連線會被拒絕。</p>



<p></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ubuntu 24 安裝 Oh My Zsh</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-oh-my-zsh/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-oh-my-zsh/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Mon, 02 Feb 2026 14:32:40 +0000</pubDate>
				<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7715</guid>

					<description><![CDATA[在 Ubuntu 24.04 安裝 Oh My ...]]></description>
										<content:encoded><![CDATA[
<p>在 Ubuntu 24.04 安裝 Oh My Zsh 的步驟非常直覺，主要分為安裝 Zsh 本體、下載 Oh My Zsh 框架以及後續的套件設定。</p>



<h2 class="wp-block-heading">安裝 Zsh</h2>



<p>Ubuntu 預設使用 Bash，所以要先安裝 Zsh 並將其設為預設 shell。</p>



<p>Bash</p>



<pre class="wp-block-code"><code># 更新套件清單
sudo apt update

# 安裝 zsh 與 git（下載框架時需要）
sudo apt install zsh git curl -y

# 確認安裝版本
zsh --version

# 將 Zsh 設為目前使用者的預設 shell
chsh -s $(which zsh)
</code></pre>



<p>執行完成後，需要登出並重新登入，或者直接重啟電腦，變更才會生效。</p>



<h2 class="wp-block-heading">安裝 Oh My Zsh</h2>



<p>Oh My Zsh 提供了一鍵安裝腳本，你可以選擇使用 curl 或 wget 來執行。</p>



<p>Bash</p>



<pre class="wp-block-code"><code># 使用 curl 安裝
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
</code></pre>



<p>安裝過程中，腳本會詢問是否要將 Zsh 設為預設 shell，如果你剛才已經執行過 chsh，這裡選 Y 或 N 都可以。安裝成功後，你會看到經典的 Oh My Zsh 大 Logo。</p>



<h2 class="wp-block-heading">常用插件與主題設定</h2>



<p>預設的主題是 robbyrussell。如果想修改主題或啟用插件，請編輯家目錄下的設定檔。</p>



<p>Bash</p>



<pre class="wp-block-code"><code>nano ~/.zshrc
</code></pre>



<p>在檔案中找到以下內容進行修改：</p>



<ul class="wp-block-list">
<li>主題：修改 ZSH_THEME=&#8221;robbyrussell&#8221; 這一行。</li>



<li>插件：找到 plugins=(git) 這一行，可以在括號內加入其他預設插件，例如 plugins=(git docker sudo)。</li>
</ul>



<h2 class="wp-block-heading">推薦安裝外掛（自動補全與語法高亮）</h2>



<p>這兩個外掛能大幅提升使用體驗，需要額外從 GitHub 下載。</p>



<p>Bash</p>



<pre class="wp-block-code"><code># 語法高亮 (zsh-syntax-highlighting)
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

# 自動補全建議 (zsh-autosuggestions)
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
</code></pre>



<p>下載後，請再次編輯 ~/.zshrc，將它們加入 plugins 清單中：</p>



<p>Bash</p>



<pre class="wp-block-code"><code>plugins=(git zsh-syntax-highlighting zsh-autosuggestions)
</code></pre>



<p>最後執行 source ~/.zshrc 讓設定立即生效。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>這是一個完整的自動化腳本，你可以將其內容複製並存成 install_zsh.sh，然後執行它。這個腳本會幫你安裝 Zsh、Oh My Zsh 以及兩個最受歡迎的插件。</p>



<h2 class="wp-block-heading">自動化安裝腳本</h2>



<p>這個腳本包含了環境檢查與插件配置，適合在乾淨的 Ubuntu 24.04 環境執行。</p>



<p>Bash</p>



<pre class="wp-block-code"><code>#!/bin/bash

# 更新套件並安裝必要工具
sudo apt update &amp;&amp; sudo apt install -y zsh git curl

# 下載並安裝 Oh My Zsh (自動跳過互動模式)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended

# 定義插件路徑
ZSH_CUSTOM_DIR=${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}

# 安裝 zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM_DIR/plugins/zsh-syntax-highlighting

# 安裝 zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM_DIR/plugins/zsh-autosuggestions

# 修改 .zshrc 啟用插件
sed -i 's/plugins=(git)/plugins=(git zsh-syntax-highlighting zsh-autosuggestions)/' ~/.zshrc

# 切換預設 Shell
sudo chsh -s $(which zsh) $USER

echo "安裝完成，請重新啟動終端機或輸入 'zsh' 開始使用。"
</code></pre>



<h2 class="wp-block-heading">如何執行</h2>



<p>請在終端機依照順序輸入以下指令。</p>



<p>Bash</p>



<pre class="wp-block-code"><code># 建立腳本檔案
nano install_zsh.sh

# 將上面的程式碼貼入後，按 Ctrl+O 儲存，Ctrl+X 離開

# 賦予執行權限
chmod +x install_zsh.sh

# 執行腳本
./install_zsh.sh
</code></pre>



<h2 class="wp-block-heading">注意事項</h2>



<p>腳本執行完畢後，目前的畫面可能還是舊的 Bash，請直接輸入 zsh 切換，或者關閉視窗重新開啟。如果你發現指令補全的顏色太暗看不清楚，這是因為終端機配色（如預設的 Ubuntu 紫色背景）與外掛顏色衝突，建議到終端機設定調整配色方案為內建的 Color schemes 即可。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-oh-my-zsh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ubuntu VPS 增加 Swap 空間</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/ubuntu-vps-swap/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/ubuntu-vps-swap/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Mon, 02 Feb 2026 13:40:46 +0000</pubDate>
				<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7712</guid>

					<description><![CDATA[要在 Ubuntu 24.04 的 VPS 上增...]]></description>
										<content:encoded><![CDATA[
<p>要在 Ubuntu 24.04 的 VPS 上增加 swap 空間，你可以按照下列步驟操作。這通常用於記憶體較小的伺服器，防止因為記憶體不足導致程式崩潰。</p>



<h3 class="wp-block-heading">檢查目前的 swap 狀態</h3>



<p>在開始之前，先確認系統是否已經有 swap 空間。輸入 free -h 或是 swapon &#8211;show。如果輸出結果是空的，代表目前沒有 swap。</p>



<h3 class="wp-block-heading">建立 swap 檔案</h3>



<p>決定你要增加的大小，通常建議是記憶體的 1 倍到 2 倍。這裡以增加 2G 為例。</p>



<p>使用 fallocate 指令快速建立檔案：</p>



<pre class="wp-block-code"><code>sudo fallocate -l 2G /swapfile</code></pre>



<p>如果系統提示找不到 fallocate，也可以使用傳統的 dd 指令：</p>



<pre class="wp-block-code"><code>sudo dd if=/dev/zero of=/swapfile bs=1M count=2048</code></pre>



<h3 class="wp-block-heading">設定檔案權限</h3>



<p>為了安全起見，只有 root 使用者應該有讀寫 swap 檔案的權限。</p>



<pre class="wp-block-code"><code>sudo chmod 600 /swapfile</code></pre>



<h3 class="wp-block-heading">格式化並啟用檔案</h3>



<p>將該檔案轉化為 swap 格式：</p>



<pre class="wp-block-code"><code>sudo mkswap /swapfile</code></pre>



<p>接著啟用它：</p>



<pre class="wp-block-code"><code>sudo swapon /swapfile</code></pre>



<p>此時你可以再次輸入 free -h，應該就能看到 swap 欄位出現了剛才設定的大小。</p>



<h3 class="wp-block-heading">設定開機自動掛載</h3>



<p>目前的設定在重啟伺服器後會消失。為了讓它永久生效，需要修改 /etc/fstab 檔案。</p>



<p>建議先備份檔案：</p>



<pre class="wp-block-code"><code>sudo cp /etc/fstab /etc/fstab.bak</code></pre>



<p>然後將設定寫入：</p>



<pre class="wp-block-code"><code>echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab</code></pre>



<h3 class="wp-block-heading">調整 swappiness 參數</h3>



<p>swappiness 決定系統使用 swap 的頻率，數值在 0 到 100 之間。對於 VPS 來說，通常設定在 10 到 60 之間比較合適。數值愈小，系統愈傾向使用實體記憶體。</p>



<p>查看目前數值：</p>



<pre class="wp-block-code"><code>cat /proc/sys/vm/swappiness</code></pre>



<p>如果你想暫時修改為 10：</p>



<pre class="wp-block-code"><code>sudo sysctl vm.swappiness=10</code></pre>



<p>若要永久修改，請編輯 /etc/sysctl.conf</p>



<pre class="wp-block-code"><code>sudo nano /etc/sysctl.conf</code></pre>



<p>在檔案末尾加入</p>



<pre class="wp-block-code"><code>vm.swappiness=10</code></pre>



<p>或直接使用 script 修改</p>



<pre class="wp-block-code"><code>echo "調整 swappiness 為 10..."
sysctl vm.swappiness=10
if ! grep -q "vm.swappiness" /etc/sysctl.conf; then
    echo "vm.swappiness=10" >> /etc/sysctl.conf
else
    sed -i 's/vm.swappiness=.*/vm.swappiness=10/' /etc/sysctl.conf
fi</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>這是一個自動化腳本，你可以將它儲存在伺服器上執行。這個腳本會自動建立一個 2G 的 swap 檔案，並完成所有權限與永久掛載的設定。</p>



<h3 class="wp-block-heading">建立自動化腳本</h3>



<p>你可以使用 nano 建立檔案：</p>



<pre class="wp-block-code"><code>nano setup_swap.sh</code></pre>



<p>將以下內容貼上：</p>



<p>Bash</p>



<pre class="wp-block-code"><code>#!/bin/bash

# 設定 swap 大小為 2G
SWAP_SIZE="2G"
SWAP_PATH="/swapfile"

# 檢查是否具備 root 權限
if &#91;&#91; $EUID -ne 0 ]]; then
   echo "請使用 sudo 執行此腳本"
   exit 1
fi

echo "正在建立 ${SWAP_SIZE} 的 swap 檔案..."
fallocate -l $SWAP_SIZE $SWAP_PATH || dd if=/dev/zero of=$SWAP_PATH bs=1M count=2048

echo "設定權限..."
chmod 600 $SWAP_PATH

echo "格式化 swap..."
mkswap $SWAP_PATH

echo "啟用 swap..."
swapon $SWAP_PATH

echo "設定開機自動掛載..."
if ! grep -q "$SWAP_PATH" /etc/fstab; then
    echo "$SWAP_PATH none swap sw 0 0" &gt;&gt; /etc/fstab
fi

echo "調整 swappiness 為 10..."
sysctl vm.swappiness=10
if ! grep -q "vm.swappiness" /etc/sysctl.conf; then
    echo "vm.swappiness=10" &gt;&gt; /etc/sysctl.conf
else
    sed -i 's/vm.swappiness=.*/vm.swappiness=10/' /etc/sysctl.conf
fi

echo "完成！目前的記憶體狀態："
free -h
</code></pre>



<h3 class="wp-block-heading">執行腳本</h3>



<p>存檔離開後（Ctrl+O 然後 Ctrl+X），賦予執行權限並執行：</p>



<pre class="wp-block-code"><code>chmod +x setup_swap.sh
sudo ./setup_swap.sh</code></pre>



<h3 class="wp-block-heading">確認結果</h3>



<p>執行完畢後，你可以觀察最後顯示的表格。如果 swap 這一列的總量（total）不再是 0，就代表設定成功。這個腳本也幫你處理了 swappiness 的設定，讓伺服器優先使用物理記憶體，只有在必要時才動用硬碟上的 swap，這有助於維持效能。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/ubuntu-vps-swap/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ubuntu 24 無法直接安裝 python package</title>
		<link>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-python-package/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-python-package/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Mon, 02 Feb 2026 12:59:13 +0000</pubDate>
				<category><![CDATA[Python筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=7706</guid>

					<description><![CDATA[在 Ubuntu 24.04 中，系統預設安裝 ...]]></description>
										<content:encoded><![CDATA[
<p>在 Ubuntu 24.04 中，系統預設安裝 Python 3.12。為了維護系統穩定，這類較新的 Linux 版本採用了 PEP 668 規範，限制直接使用 pip 將套件安裝到全域環境。如果你直接執行 pip install，通常會看到外部管理環境的錯誤提示。</p>



<h3 class="wp-block-heading">使用虛擬環境安裝</h3>



<p>這是目前最推薦且標準的作法，可以避免不同專案之間的套件衝突。你必須先安裝 venv 工具，然後建立一個獨立的資料夾來存放套件。</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install python3-venv
python3 -m venv myenv
source myenv/bin/activate</code></pre>



<p>進入虛擬環境後，終端機提示字元前會出現環境名稱，這時你就可以放心使用 pip install 安裝任何套件，它們會被存放在 myenv 資料夾內。</p>



<h3 class="wp-block-heading">使用 pipx 安裝工具</h3>



<p>如果你想安裝的是像 black、ansible 或 flake8 這種可以在終端機直接執行的工具，而不是要在程式碼裡 import 的函式庫，pipx 是最好的選擇。它會自動幫每個工具建立隔離環境並設定好執行路徑。</p>



<pre class="wp-block-code"><code>sudo apt install pipx
pipx ensurepath
pipx install 套件名稱</code></pre>



<h3 class="wp-block-heading">使用 APT 系統套件管理</h3>



<p>如果你需要的套件非常常見，例如 NumPy 或 Requests，Ubuntu 的官方軟體倉庫通常會有維護好的版本。這些套件會安裝在全域，且由系統統一管理。</p>



<pre class="wp-block-code"><code>sudo apt install python3-numpy</code></pre>



<h3 class="wp-block-heading">強制全域安裝</h3>



<p>雖然非常不建議，但如果你非得在全域環境安裝套件且不在乎系統穩定性，可以使用 break-system-packages 參數來跳過保護機制。請注意這可能會導致 Ubuntu 系統內建的 Python 工具故障。</p>



<pre class="wp-block-code"><code>pip install 套件名稱 --break-system-packages</code></pre>



<p>要退出已經啟動的 Python 虛擬環境，方法非常簡單，只需要在終端機輸入一個指令即可。</p>



<h3 class="wp-block-heading">使用 deactivate 指令</h3>



<p>當你完成工作，想要回到 Ubuntu 系統預設的 Python 環境時，直接輸入：</p>



<pre class="wp-block-code"><code>deactivate</code></pre>



<p>執行後，你會發現終端機提示字元前方的括號環境名稱（例如 (myenv)）消失了，這表示你已經成功登出虛擬環境。這個指令不需要加上 sudo，也不需要路徑，因為在你啟動環境時，deactivate 函式就已經被載入到目前的 shell 階段中。</p>



<h3 class="wp-block-heading">刪除虛擬環境</h3>



<p>如果你不再需要這個虛擬環境，想要徹底移除它，做法並非透過 pip 卸載，而是直接刪除該環境所在的資料夾。</p>



<pre class="wp-block-code"><code>rm -rf myenv</code></pre>



<p>這會刪除所有在該環境中安裝的套件與相關設定，且不會影響到系統其他的 Python 設定。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>python3 -m pip install pr pip-req.txt<br>error: externally-managed-environment</p>



<p>× This environment is externally managed<br>╰─&gt; To install Python packages system-wide, try apt install<br>python3-xyz, where xyz is the package you are trying to<br>install.</p>



<pre class="wp-block-code"><code>If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.

If you wish to install a non-Debian packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.

See /usr/share/doc/python3.12/README.venv for more information.</code></pre>



<p>note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing &#8211;break-system-packages.<br>hint: See PEP 668 for the detailed specification.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>python3 -m venv ./venv<br>The virtual environment was not created successfully because ensurepip is not<br>available. On Debian/Ubuntu systems, you need to install the python3-venv<br>package using the following command.</p>



<pre class="wp-block-code"><code>apt install python3.12-venv</code></pre>



<p>You may need to use sudo with that command. After installing the python3-venv<br>package, recreate your virtual environment.</p>



<p>Failing command: /root/venv/bin/python3</p>



<p>➜ ~ apt install python3-venv</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>在 Ubuntu 24.04 上為 Python 3.12 安裝 MySQL 連接器，最穩定的做法是透過虛擬環境。目前主流有兩種套件選擇：官方的 mysql-connector-python 或社群常用的 mysqlclient。</p>



<h3 class="wp-block-heading">準備系統依賴項目</h3>



<p>在安裝 Python 套件之前，建議先安裝編譯所需的系統開發庫。如果是要安裝 mysqlclient（效能較好），則必須先執行以下指令：</p>



<p>sudo apt update</p>



<p>sudo apt install python3-dev default-libmysqlclient-dev build-essential</p>



<h3 class="wp-block-heading">在虛擬環境中安裝</h3>



<p>首先建立並進入虛擬環境，接著使用 pip 安裝。</p>



<p>python3 -m venv env</p>



<p>source env/bin/activate</p>



<p>如果你想安裝官方提供的連接器：</p>



<p>pip install mysql-connector-python</p>



<p>如果你想安裝效能較佳、符合 Python DB API 規範的套件：</p>



<p>pip install mysqlclient</p>



<h3 class="wp-block-heading">驗證安裝結果</h3>



<p>你可以進入 Python 互動環境測試是否安裝成功：</p>



<p>python</p>



<p>import mysql.connector</p>



<p>print(mysql.connector.<strong>version</strong>)</p>



<p>或是針對 mysqlclient：</p>



<p>python</p>



<p>import MySQLdb</p>



<p>print(MySQLdb.<strong>version</strong>)</p>



<h3 class="wp-block-heading">使用 APT 安裝（全域環境）</h3>



<p>如果你不想使用虛擬環境，而是希望整個系統都能使用，可以使用 Ubuntu 官方維護的套件。這會自動處理所有依賴關係，且不會觸發 PEP 668 的外部環境錯誤。</p>



<p>sudo apt install python3-mysql.connector</p>



<p>這種方式安裝的版本通常比較舊，但保證與系統相容。</p>



<p>需要我提供一段連接 MySQL 資料庫並執行查詢的範例程式碼嗎？</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/02/ubuntu-24-python-package/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
