<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Nginx｜林鼎淵 Dean Lin</title>
    <link>https://deanlin.net/tags/nginx/</link>
    <image><url>https://deanlin.net/images/author_hu_aa256fc934e9a932.jpg</url><title>Nginx｜林鼎淵 Dean Lin</title><link>https://deanlin.net/tags/nginx/</link><width>144</width><height>144</height></image>
    <description>林鼎淵（Dean Lin）的部落格：生成式 AI 企業內訓講師、外商資安公司軟體專家、7 本書作者。400 多篇文章用白話分享生成式 AI 實戰、Claude Code 與 Vibe Coding 教學、團隊合作與職場成長。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <copyright>© 2020–2026 林鼎淵 Dean Lin</copyright>
    <lastBuildDate>Fri, 25 Feb 2022 16:04:32 +0800</lastBuildDate>
    <atom:link href="https://deanlin.net/tags/nginx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>調整 php-fpm &amp; nginx 參數，讓 Server 可以承受更大的流量</title>
      <link>https://deanlin.net/blog/202202/tune-php-fpm-nginx/</link>
      <pubDate>Fri, 25 Feb 2022 16:04:32 +0800</pubDate>
      <guid>https://deanlin.net/blog/202202/tune-php-fpm-nginx/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>因為準備上線的系統有可能遇到大流量的情境，所以上線前先用 Apache Bench 來做測試；不測還好，一測發現在連線數 100、request 數量 10000 的條件下 Call POST API，居然有 50% 的 request…</description>
      <media:content url="https://deanlin.net/blog/202202/tune-php-fpm-nginx/images/tune-php-fpm-nginx-og_hu_2959ef8ef24dad02.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p>因為準備上線的系統有可能遇到大流量的情境，所以上線前先用 Apache Bench 來做測試；不測還好，一測發現在連線數 100、request 數量 10000 的條件下 Call POST API，居然有 50% 的 request fail，如果把這樣的系統上線肯定會出包，所以來研究如何調校 php-fpm &amp; nginx 的參數，讓 Server 在硬體不升級的狀態下盡可能承受最大的流量。</p>
<blockquote>
<p>如果對壓力測試不熟悉的朋友，可以參考筆者先前分享的文章：「<a href="https://deanlin.net/blog/202110/apache-bench-load-testing/">Apache Bench — 壓力測試好夥伴</a>」</p>
</blockquote>
<p><img src="https://deanlin.net/blog/202202/tune-php-fpm-nginx/images/tune-php-fpm-nginx-01.webp" width="1400" height="740" alt="調整 php-fpm &amp; nginx 參數，讓 Server 可以承受更大的流量（圖 1）" fetchpriority="high" decoding="async"></p>
<pre tabindex="0"><code>大綱
一、了解目前 Server 資源利用率
二、調整 php-fpm 參數
三、調整 nginx 參數增加併發數量
</code></pre><h2 id="一了解目前-server-資源利用率">一、了解目前 Server 資源利用率<a class="h-anchor" href="#%e4%b8%80%e4%ba%86%e8%a7%a3%e7%9b%ae%e5%89%8d-server-%e8%b3%87%e6%ba%90%e5%88%a9%e7%94%a8%e7%8e%87" aria-label="這個段落的連結"></a></h2>
<p>進入 Server 後，你可以用 <code>top</code> 這個指令來觀察 Server 的各項參數；它所呈現參數是動態的，非常易於理解與判斷。</p>
<p><img src="https://deanlin.net/blog/202202/tune-php-fpm-nginx/images/tune-php-fpm-nginx-02.webp" width="1400" height="790" alt="一、了解目前 Server 資源利用率（圖 2）" loading="lazy" decoding="async"></p>
<p>接下來你可以執行一段 Apache Bench 的指令（建議是 POST），來測試看看他怎麼爆掉的：</p>
<pre tabindex="0"><code>ab -n 10000 -c 100 -p post.txt -T application/json -H ‘Authorization: Token your_token’ https://your_test_ip/
</code></pre><p>上面的指令執行後，可以得到類似下面的報表：</p>
<p><img src="https://deanlin.net/blog/202202/tune-php-fpm-nginx/images/tune-php-fpm-nginx-03.webp" width="1400" height="668" alt="一、了解目前 Server 資源利用率（圖 3）" loading="lazy" decoding="async"></p>
<p>在上面報表中可以看到居然有 50% 的 request fail，可是用 <code>top</code>觀察 Server 的資源時，發現無論是 CPU 、記憶體距離極限還有一段距離，且 idle 都還有剩：</p>
<p><img src="https://deanlin.net/blog/202202/tune-php-fpm-nginx/images/tune-php-fpm-nginx-04.webp" width="759" height="126" alt="一、了解目前 Server 資源利用率（圖 4）" loading="lazy" decoding="async"></p>
<p>所以下面我教大家調整哪些 php-fpm &amp; nginx 的設定，盡量讓這台 Server 發揮出他的極限。</p>
<blockquote>
<p><strong>備註 1</strong>：通常 POST 對資源的消耗遠超 GET，如果 API 會修改資料庫內容、進行複雜計算就會消耗更多資源，這些都是要考量進去的。</p>
<p><strong>備註 2</strong>：我們的目標是<strong>追求承受最大流量，而不是努力把 CPU 和 MEM 耗盡</strong>；經實驗，有時把他們耗盡反而會有更多的 request fail，這部分有興趣的讀者可以自己實驗看看。</p>
</blockquote>
<hr>
<h2 id="二調整-php-fpm-參數">二、調整 php-fpm 參數<a class="h-anchor" href="#%e4%ba%8c%e8%aa%bf%e6%95%b4-php-fpm-%e5%8f%83%e6%95%b8" aria-label="這個段落的連結"></a></h2>
<h3 id="step-1先進入-php-fpm-的-conf-設定檔">STEP 1：先進入 php-fpm 的 conf 設定檔<a class="h-anchor" href="#step-1%e5%85%88%e9%80%b2%e5%85%a5-php-fpm-%e7%9a%84-conf-%e8%a8%ad%e5%ae%9a%e6%aa%94" aria-label="這個段落的連結"></a></h3>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo vi /etc/php/7.4/fpm/pool.d/www.conf
</span></span></code></pre></div><p>然後認識以下參數各自有什麼作用：</p>
<ul>
<li><strong>pm</strong>：預設為「dynamic」，如果設定為「static」下面的參數只有「pm.max_children」會生效。</li>
<li><strong>pm.max_children</strong>：設置子進程最大數值，子進程數量太少會影響處理連線的速度，太多可能會導致資源耗盡。</li>
<li><strong>pm.start_servers</strong>：php-fpm 啟動起始進程數，數值需小於 pm.max_children。</li>
</ul>
<blockquote>
<p>建議為：(pm.max_spare_servers — pm.min_spare_servers)/2</p>
</blockquote>
<ul>
<li><strong>pm.min_spare_servers</strong>：php-fpm 的最小空閒進程數。</li>
<li><strong>pm.max_spare_servers</strong>：php-fpm 的最大空閒進程數。</li>
<li><strong>pm.max_requests</strong>：當子進程的 request 數量到達後關閉，再開一個新的。</li>
</ul>
<p>下面提供的參數<strong>僅為範例</strong>，請依照 Server 實際狀況調整，並且用 <code>top</code> 這個指令觀察資源消耗狀態（主要看 CPU、MEM 使用率）。</p>
<pre tabindex="0"><code>pm = dynamic
pm.max_children = 200
pm.start_servers = 150
pm.min_spare_servers = 100
pm.max_spare_servers = 200
pm.max_requests = 1000
</code></pre><h3 id="step-2完成後後重啟-php-fpm">STEP 2：完成後後重啟 php fpm<a class="h-anchor" href="#step-2%e5%ae%8c%e6%88%90%e5%be%8c%e5%be%8c%e9%87%8d%e5%95%9f-php-fpm" aria-label="這個段落的連結"></a></h3>
<p>執行下面指令才會生效喔～</p>
<pre tabindex="0"><code>service php7.4-fpm restart
</code></pre><p>如果剛剛的參數設定上有問題或是錯誤，上面會有錯誤提示，跟著提示操作就好了：</p>
<p><img src="https://deanlin.net/blog/202202/tune-php-fpm-nginx/images/tune-php-fpm-nginx-05.webp" width="1279" height="530" alt="STEP 2：完成後後重啟 php fpm（圖 5）" loading="lazy" decoding="async"></p>
<hr>
<h2 id="三調整-nginx-參數增加併發數量">三、調整 nginx 參數增加併發數量<a class="h-anchor" href="#%e4%b8%89%e8%aa%bf%e6%95%b4-nginx-%e5%8f%83%e6%95%b8%e5%a2%9e%e5%8a%a0%e4%bd%b5%e7%99%bc%e6%95%b8%e9%87%8f" aria-label="這個段落的連結"></a></h2>
<p>調整完 php-fpm 的參數後，Server 相較之前可以承受更大的流量；但如隨著系統使用者的成長，你很快會遇到下一個瓶頸，在決定花錢升級 Server 硬體水平前，可以先嘗試調整 nginx 的參數，看看是否能在支撐一段時間ＸＤ</p>
<h3 id="step-1確認-server-有多少個-cpu-核心">STEP 1：確認 Server 有多少個 CPU 核心<a class="h-anchor" href="#step-1%e7%a2%ba%e8%aa%8d-server-%e6%9c%89%e5%a4%9a%e5%b0%91%e5%80%8b-cpu-%e6%a0%b8%e5%bf%83" aria-label="這個段落的連結"></a></h3>
<p>下面這段指令可以知道這台 Server 有多少個 CPU 核心（worker_processes）：</p>
<pre tabindex="0"><code>grep processor /proc/cpuinfo | wc -l
</code></pre><h3 id="step-2進入-nginx-的-conf-設定檔">STEP 2：進入 nginx 的 conf 設定檔<a class="h-anchor" href="#step-2%e9%80%b2%e5%85%a5-nginx-%e7%9a%84-conf-%e8%a8%ad%e5%ae%9a%e6%aa%94" aria-label="這個段落的連結"></a></h3>
<p>接著進入<strong>nginx.conf</strong>，查看目前 nginx 默認使用多少 CPU 核心數。</p>
<pre tabindex="0"><code>vi /etc/nginx/nginx.conf
</code></pre><p>你可以將 <strong>worker_processes</strong> 調整成 CPU 核心數，或是用 auto 讓他自動偵測：</p>
<pre tabindex="0"><code>worker_processes auto;
</code></pre><p>如果系統會遇到高併發場景，可以設置 <strong>events</strong> 的參數如下：</p>
<ul>
<li><strong>worker_connections</strong>：設定 worker 最大可承受連線數（最大值為 65535）。</li>
</ul>
<blockquote>
<p>連線的總數為 worker_processes * worker_connections。</p>
</blockquote>
<ul>
<li><strong>multi_accept</strong>：收到一個 request 後，盡可能多接收其他的 request。</li>
<li><strong>use epoll</strong>：利用很棒的演算法提升效能。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span>events<span style="color:#6e7681"> </span><span style="color:#f85149">{</span><span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span>worker_connections<span style="color:#6e7681"> </span><span style="color:#a5d6ff">4096</span>;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span>multi_accept<span style="color:#6e7681"> </span><span style="color:#ff7b72">on</span>;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#6e7681">    </span>use<span style="color:#6e7681"> </span>epoll;<span style="color:#6e7681">
</span></span></span><span style="display:flex;"><span><span style="color:#f85149">}</span><span style="color:#6e7681">
</span></span></span></code></pre></div><h3 id="step-3設定完記得要重啟-nginx">STEP 3：設定完記得要重啟 nginx<a class="h-anchor" href="#step-3%e8%a8%ad%e5%ae%9a%e5%ae%8c%e8%a8%98%e5%be%97%e8%a6%81%e9%87%8d%e5%95%9f-nginx" aria-label="這個段落的連結"></a></h3>
<pre tabindex="0"><code>nginx -s reload
</code></pre><hr>
<blockquote class="pullquote"><p>希望這篇文章能讓讀者初步了解在 php-fpm &amp; nginx 的設定中，哪些參數可以讓 Server 承受更大的流量，如果讀者有使用其他妙招也歡迎分享喔～</p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Nginx高頻率使用功能</title>
      <link>https://deanlin.net/blog/202006/nginx-common-features/</link>
      <pubDate>Mon, 22 Jun 2020 16:09:35 +0800</pubDate>
      <guid>https://deanlin.net/blog/202006/nginx-common-features/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>我將在這裡記錄Nginx時常被問到但很難說清楚的問題及實作方式，文章參考許多前輩們的文獻，在此先感謝他們的無私貢獻</description>
      <media:content url="https://deanlin.net/blog/202006/nginx-common-features/images/nginx-common-features-og_hu_e6da9597bb5ee985.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p><img src="https://deanlin.net/blog/202006/nginx-common-features/images/nginx-common-features-01.webp" width="960" height="540" alt="Nginx高頻率使用功能（圖 1）" fetchpriority="high" decoding="async"></p>
<h3 id="相關議題">相關議題<a class="h-anchor" href="#%e7%9b%b8%e9%97%9c%e8%ad%b0%e9%a1%8c" aria-label="這個段落的連結"></a></h3>
<ol>
<li>反向代理伺服器(reverse proxy)</li>
<li>負載平衡(load balancer)</li>
<li>虛擬主機(Virtual Host)</li>
</ol>
<h2 class="h-nomark" id="1-反向代理伺服器reverse-proxy">1. 反向代理伺服器(reverse proxy)<a class="h-anchor" href="#1-%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86%e4%bc%ba%e6%9c%8d%e5%99%a8reverse-proxy" aria-label="這個段落的連結"></a></h2>
<blockquote>
<p>正向代理伺服器：用來解決訪問限制問題</p>
<p>反向代理伺服器：提供負載均衡、安全防護等作用</p>
</blockquote>
<p>你可以理解為你網頁的前端實際使用server的port是3000，但是透過Nginx可以把對方80 port的連線導向3000 port，應用如下：</p>
<pre tabindex="0"><code>vi /etc/nginx/sites-enabled/default
</code></pre><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {   
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span>;   <span style="color:#ff7b72">//外部nginx監聽port</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">location</span> <span style="color:#a5d6ff">/</span> {   
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_pass</span> <span style="color:#a5d6ff">http://127.0.0.1:3000</span>; <span style="color:#8b949e;font-style:italic">#你可以把它當成local端轉port的服務
</span></span></span><span style="display:flex;"><span>        <span style="color:#8b949e;font-style:italic"># proxy_pass http://172.1.1.1; #這是實際訪問的ip位址  
</span></span></span><span style="display:flex;"><span>    }   
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/169bc78205976713c685ef3e1611f069" rel="noopener">reverse_proxy.conf</a>（GitHub Gist）</p>
<p>實務上野可能會直接把它當成一個自動轉址的中介Service，像是外面所輸入的domain name實際上都是指向同一台nginx server，經過這台nginx 的設定分析過後再導向真正的server</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span>         <span style="color:#a5d6ff">*:443</span> <span style="color:#a5d6ff">ssl</span>; <span style="color:#8b949e;font-style:italic">#https
</span></span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span>   <span style="color:#a5d6ff">your.domain.name1</span>; <span style="color:#8b949e;font-style:italic">#外面輸入的網址
</span></span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">client_max_body_size</span> <span style="color:#a5d6ff">2000M</span>; <span style="color:#8b949e;font-style:italic">#上傳檔案大小限制
</span></span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">fastcgi_read_timeout</span> <span style="color:#a5d6ff">3600s</span>; <span style="color:#8b949e;font-style:italic"># nginx執行時間
</span></span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">proxy_read_timeout</span> <span style="color:#a5d6ff">3600s</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_certificate</span> <span style="color:#a5d6ff">/var/www/cert.chain.crt</span>; <span style="color:#8b949e;font-style:italic"># ssl檔案位置
</span></span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_certificate_key</span> <span style="color:#a5d6ff">/var/www/www_ruggon_com.key</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">location</span> <span style="color:#a5d6ff">/</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_pass</span> <span style="color:#a5d6ff">https:</span><span style="color:#8b949e;font-style:italic">#172.6.5.8; # 目標導向的服務位址
</span></span></span><span style="display:flex;"><span>    <span style="color:#f85149">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f85149">}</span>
</span></span><span style="display:flex;"><span><span style="color:#a5d6ff">server</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span>         <span style="color:#a5d6ff">*:443</span> <span style="color:#a5d6ff">ssl</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span>   <span style="color:#a5d6ff">your.domain.name2</span>; <span style="color:#8b949e;font-style:italic">#外面輸入的網址
</span></span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_certificate</span> <span style="color:#a5d6ff">/var/www/cert.chain.crt</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_certificate_key</span> <span style="color:#a5d6ff">/var/www/www_ruggon_com.key</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">location</span> <span style="color:#a5d6ff">/</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_pass</span> <span style="color:#a5d6ff">https:</span><span style="color:#8b949e;font-style:italic">#172.6.5.10; # 目標導向的服務位址
</span></span></span><span style="display:flex;"><span>    <span style="color:#f85149">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f85149">}</span>
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic">#下面為讀取80 port http轉https的功能
</span></span></span><span style="display:flex;"><span><span style="color:#a5d6ff">server</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">[::]:80</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">server_name</span> <span style="color:#a5d6ff">your.domain.name1</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">return</span> <span style="color:#a5d6ff">301</span> <span style="color:#a5d6ff">https:</span><span style="color:#8b949e;font-style:italic">#$host$request_uri;
</span></span></span><span style="display:flex;"><span><span style="color:#f85149">}</span>
</span></span><span style="display:flex;"><span><span style="color:#a5d6ff">server</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">[::]:80</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">server_name</span> <span style="color:#a5d6ff">your.domain.name</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">return</span> <span style="color:#a5d6ff">301</span> <span style="color:#a5d6ff">https:</span><span style="color:#8b949e;font-style:italic">#$host$request_uri;
</span></span></span><span style="display:flex;"><span><span style="color:#f85149">}</span>
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/5956b633bb1bf9af45f93e416f6e9a41" rel="noopener">redirect.conf</a>（GitHub Gist）</p>
<h2 class="h-nomark" id="2-負載平衡load-balancer">2. 負載平衡(load balancer)<a class="h-anchor" href="#2-%e8%b2%a0%e8%bc%89%e5%b9%b3%e8%a1%a1load-balancer" aria-label="這個段落的連結"></a></h2>
<p>如果一個網站的訪問量非常大，一台server已經無法負擔時，你可以透過load balance(多幾台server來分攤這些流量，當某一台server掛掉的時候你的網站還是活得很好)處理</p>
<p>Nginx實務上你可以根據server實際上的硬體條件去分散每個server的流量，在這裡我以透過Nginx分流到兩個server上面做解釋：</p>
<p>SETP 1/3 : server A的Nginx設定</p>
<pre tabindex="0"><code>vi /etc/nginx/sites-enabled/default
</code></pre><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span>;
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#8b949e;font-style:italic">#Proxy的位置，提供給使用者連線
</span></span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span>  <span style="color:#a5d6ff">server_a.com</span>; 
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">access_log</span> <span style="color:#a5d6ff">/var/log/nginx/server_a.com</span> <span style="color:#a5d6ff">main</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">error_log</span> <span style="color:#a5d6ff">/var/log/nginx/server_a.com</span> <span style="color:#a5d6ff">warn</span>;
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">location</span> <span style="color:#a5d6ff">/</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">root</span>   <span style="color:#a5d6ff">/usr/share/nginx/html</span>;<span style="color:#8b949e;font-style:italic"># 靜態文件路徑
</span></span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">index</span>  <span style="color:#a5d6ff">index.html</span> <span style="color:#a5d6ff">index.htm</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/9f199fd23e615fdcf568702f86698cfd" rel="noopener">server_a.conf</a>（GitHub Gist）</p>
<p>SETP 2/3 : server B的Nginx設定</p>
<pre tabindex="0"><code>vi /etc/nginx/sites-enabled/default
</code></pre><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span>;
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#8b949e;font-style:italic">#Proxy的位置，提供給使用者連線
</span></span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span>  <span style="color:#a5d6ff">server_b.com</span>; 
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">access_log</span> <span style="color:#a5d6ff">/var/log/nginx/server_b.com</span> <span style="color:#a5d6ff">main</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">error_log</span> <span style="color:#a5d6ff">/var/log/nginx/server_b.com</span> <span style="color:#a5d6ff">warn</span>;
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">location</span> <span style="color:#a5d6ff">/</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">root</span>   <span style="color:#a5d6ff">/usr/share/nginx/html</span>; <span style="color:#8b949e;font-style:italic">#靜態文件路徑
</span></span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">index</span>  <span style="color:#a5d6ff">index.html</span> <span style="color:#a5d6ff">index.htm</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/eb788190ed0de8adff45c3da1f64bf73" rel="noopener">server_b.conf</a>（GitHub Gist）</p>
<p>STEP 3/3 : nginx來處理負載平衡</p>
<pre tabindex="0"><code>vi /etc/nginx/sites-enabled/default
</code></pre><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic"># weight是資源分散的權重，可根據server本身硬體條件做調整
</span></span></span><span style="display:flex;"><span><span style="color:#ff7b72">upstream</span> <span style="color:#a5d6ff">your_web</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server</span> <span style="color:#a5d6ff">server_a.com</span> <span style="color:#a5d6ff">weight=3</span>;<span style="color:#8b949e;font-style:italic">#前面設定的server_name，或者用存粹的ip也可以()
</span></span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server</span> <span style="color:#a5d6ff">server_a.com</span> <span style="color:#a5d6ff">weight=2</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span>       <span style="color:#a5d6ff">443</span> <span style="color:#a5d6ff">ssl</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span>  <span style="color:#a5d6ff">server.com</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">access_log</span> <span style="color:#a5d6ff">/var/log/nginx/server.com.access.log</span> <span style="color:#a5d6ff">main</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">error_log</span> <span style="color:#a5d6ff">/var/log/nginx/server.com.error.log</span> <span style="color:#a5d6ff">warn</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_certificate</span> <span style="color:#a5d6ff">server.com.crt</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_certificate_key</span> <span style="color:#a5d6ff">server.com..key</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">ssl_protocols</span> <span style="color:#a5d6ff">TLSv1</span> <span style="color:#a5d6ff">TLSv1.1</span> <span style="color:#a5d6ff">TLSv1.2</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">location</span> <span style="color:#a5d6ff">/</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_pass</span> <span style="color:#a5d6ff">http://your_web</span>;<span style="color:#8b949e;font-style:italic">#真實網址
</span></span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_set_header</span>   <span style="color:#a5d6ff">Host</span>    <span style="color:#79c0ff">$host</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_set_header</span>   <span style="color:#a5d6ff">X-Real-IP</span>   <span style="color:#79c0ff">$remote_addr</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_set_header</span>   <span style="color:#a5d6ff">X-Forwarded-For</span> <span style="color:#79c0ff">$proxy_add_x_forwarded_for</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/c59dd2d76bd61d9f7e74749aa9959b57" rel="noopener">nginx.conf</a>（GitHub Gist）</p>
<h2 class="h-nomark" id="3-虛擬主機virtual-host">3. 虛擬主機(Virtual Host)<a class="h-anchor" href="#3-%e8%99%9b%e6%93%ac%e4%b8%bb%e6%a9%9fvirtual-host" aria-label="這個段落的連結"></a></h2>
<p>如果單一網站的流量太小，你會覺得他獨佔一台server有點浪費，所以除了負載平衡(load balance)這種導流量的做法外，你也可以讓一台server在不同的port開啟多個服務</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {  
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span> <span style="color:#a5d6ff">default_server</span>;  
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span> <span style="color:#a5d6ff">_</span>;  
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">return</span> <span style="color:#a5d6ff">444</span>; <span style="color:#8b949e;font-style:italic"># 過濾其他domain name返回444
</span></span></span><span style="display:flex;"><span>}   
</span></span><span style="display:flex;"><span> 
</span></span><span style="display:flex;"><span> 
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {  
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span>;  
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span> <span style="color:#a5d6ff">your.domain.name1</span>;
</span></span><span style="display:flex;"><span> 
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">location</span> <span style="color:#a5d6ff">/</span> {  
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_pass</span> <span style="color:#a5d6ff">http://localhost:8080</span>; <span style="color:#8b949e;font-style:italic"># 內部對應的port
</span></span></span><span style="display:flex;"><span>    }  
</span></span><span style="display:flex;"><span>}  
</span></span><span style="display:flex;"><span> 
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">server</span> {   
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">listen</span> <span style="color:#a5d6ff">80</span>;   
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">server_name</span> <span style="color:#a5d6ff">your.domain.name2</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">location</span> <span style="color:#a5d6ff">/</span> {   
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">proxy_pass</span> <span style="color:#a5d6ff">http://localhost:8081</span>; <span style="color:#8b949e;font-style:italic"># 內部對應的port 
</span></span></span><span style="display:flex;"><span>    }   
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/25717edfe9b85681caddbb0827f8b389" rel="noopener">VirtualHost.conf</a>（GitHub Gist）</p>
<p>參考資源：<a href="https://blog.dtask.idv.tw/Nginx/2018-07-31/">使用 Nginx 做 Load Balancer</a>、<a href="https://blog.csdn.net/qq_25843323/article/details/81902015">Nginx簡介</a>、<a href="https://kknews.cc/zh-tw/tech/k66p2gb.html">正向代理和反向代理解釋</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Nginx — 你網頁的好夥伴</title>
      <link>https://deanlin.net/blog/202006/nginx-introduction/</link>
      <pubDate>Wed, 10 Jun 2020 14:48:28 +0800</pubDate>
      <guid>https://deanlin.net/blog/202006/nginx-introduction/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>這個好用的網頁伺服器工具最近兩年被我大量使用，因為他的設定簡單，功能強大，在這裡我會把分幾個部分做說明：</description>
      <media:content url="https://deanlin.net/blog/202006/nginx-introduction/images/nginx-introduction-og_hu_ca271e957762a36c.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p><img src="https://deanlin.net/blog/202006/nginx-introduction/images/nginx-introduction-01.webp" width="1170" height="674" alt="Nginx — 你網頁的好夥伴（圖 1）" fetchpriority="high" decoding="async"></p>
<p>這個好用的網頁伺服器工具最近兩年被我大量使用，因為他的設定簡單，功能強大，在這裡我會把分幾個部分做說明：</p>
<ol>
<li><strong>安裝(ubuntu環境)</strong></li>
<li><strong>防火牆設定</strong></li>
<li><strong>常用操作</strong></li>
<li><strong>曾經遇到的坑</strong></li>
<li><strong>相關參考資源</strong></li>
</ol>
<h2 id="安裝ubuntu環境">安裝(ubuntu環境)<a class="h-anchor" href="#%e5%ae%89%e8%a3%9dubuntu%e7%92%b0%e5%a2%83" aria-label="這個段落的連結"></a></h2>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt-get update
</span></span><span style="display:flex;"><span>sudo apt install nginx
</span></span><span style="display:flex;"><span>sudo systemctl start nginx
</span></span><span style="display:flex;"><span>sudo systemctl enable nginx
</span></span></code></pre></div><h2 id="防火牆設定">防火牆設定<a class="h-anchor" href="#%e9%98%b2%e7%81%ab%e7%89%86%e8%a8%ad%e5%ae%9a" aria-label="這個段落的連結"></a></h2>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo ufw allow ssh  // 允許ssh登入作業
</span></span><span style="display:flex;"><span>sudo ufw allow <span style="color:#a5d6ff">80</span>  // 允許http
</span></span><span style="display:flex;"><span>sudo ufw allow <span style="color:#a5d6ff">443</span>  // 允許https
</span></span><span style="display:flex;"><span>sudo ufw allow ‘Nginx HTTP’
</span></span><span style="display:flex;"><span>sudo ufw enable // 啟動防火牆
</span></span><span style="display:flex;"><span>sudo ufw status // 列出當前防火牆狀態
</span></span><span style="display:flex;"><span>sudo ufw status numbered  // 列出當前防火牆規則號碼<span style="color:#ff7b72;font-weight:bold">(</span>通常都是為了刪除<span style="color:#ff7b72;font-weight:bold">)</span>
</span></span><span style="display:flex;"><span>sudo ufw delete <span style="color:#a5d6ff">2</span> // 刪除防火牆特定規則
</span></span></code></pre></div><h2 id="常用操作">常用操作<a class="h-anchor" href="#%e5%b8%b8%e7%94%a8%e6%93%8d%e4%bd%9c" aria-label="這個段落的連結"></a></h2>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl restart nginx  // 重啟
</span></span><span style="display:flex;"><span>sudo /etc/init.d/apache2 stop  // 暫停apache
</span></span><span style="display:flex;"><span>service php7.3-fpm restart // php的conf修改後需要重啟
</span></span></code></pre></div><h2 id="曾經遇到的坑">曾經遇到的坑<a class="h-anchor" href="#%e6%9b%be%e7%b6%93%e9%81%87%e5%88%b0%e7%9a%84%e5%9d%91" aria-label="這個段落的連結"></a></h2>
<blockquote>
<p>413 Request Entity Too Large</p>
</blockquote>
<p>如果有用nginx當loadbalance，記得/etc/nginx/sites-enabled/default的部分也要做相對應的調整</p>
<pre tabindex="0"><code>client_max_body_size 2000M;
sudo service nginx restart
</code></pre><blockquote>
<p>Git clone through Nginx proxy for Gitlab server is not working</p>
</blockquote>
<p><a href="https://stackoverflow.com/questions/38920146/git-clone-through-nginx-proxy-for-gitlab-server-is-not-working">可參考stackoverflow</a></p>
<blockquote>
<p>ssh_exchange_identification: Connection closed by remote host</p>
</blockquote>
<p>因為/etc/nginx/sites-enabled/default的地方修改無效</p>
<p>所以要在上一層/etc/nginx/nginx.conf做修正</p>
<pre tabindex="0"><code>stream {
  server {
    listen 223;
    listen [::]:223;
    proxy_pass 192.xxx.xxx.xxx:22; //目標ip:ssh port
  }
}
sudo service nginx restart
</code></pre><blockquote>
<p>server關機重啟後頁面 404</p>
</blockquote>
<p>因為安裝php的時候apache有時沒注意會被順便安裝起來</p>
<p>首先檢查是否被apache佔用</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo netstat -lpn |grep <span style="color:#a5d6ff">80</span>
</span></span></code></pre></div><p>如果是的話可以把apache暫停或是刪除</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo /etc/init.d/apache2 stop  // 暫停apache
</span></span><span style="display:flex;"><span>// 下面是刪除的方法
</span></span><span style="display:flex;"><span>sudo apt-get purge apache2 apache2-utils apache2.2-bin apache2-common
</span></span><span style="display:flex;"><span>sudo apt-get autoremove
</span></span><span style="display:flex;"><span>whereis apache2
</span></span><span style="display:flex;"><span>apache2: /etc/apache2 //列出路徑
</span></span><span style="display:flex;"><span>sudo rm -rf /etc/apache2
</span></span></code></pre></div><blockquote>
<p>nginx 502</p>
</blockquote>
<p>查看錯誤日誌</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo vi /var/log/nginx/error.log
</span></span></code></pre></div><blockquote>
<p>connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)</p>
</blockquote>
<p>如果是以上錯誤</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo vi /etc/php/7.3/fpm/pool.d/www.conf
</span></span></code></pre></div><p>将backlog前面的;去掉，并将其值改为4096.</p>
<p>保存重启fpm</p>
<pre tabindex="0"><code>service php7.3-fpm restart
</code></pre><blockquote>
<p>Nginx使用limit_req_zone對同一ip訪問進行限流</p>
</blockquote>
<p>考慮到有可能的DDOS問題，又或是一些不正常的連線次數(在短時間大量call很多次api)，可參考這兩篇文章修改nginx默認的連線設定:<a href="https://bbs.csdn.net/topics/390871977">文章1</a>、<a href="https://blog.csdn.net/jek123456/article/details/53334095">文章2</a></p>
<p>想調整可以先進入設定檔：</p>
<pre tabindex="0"><code>vi /etc/nginx/sites-available/default
</code></pre><p>針對你想要加上限制的部分加上設定：</p>
<pre tabindex="0"><code>limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=5r/s;
server {
  listen 80 default_server;
  limit_req zone=reqlimit;
}
</code></pre><ul>
<li><strong>zone=reqlimit</strong>：自己定義的名稱</li>
<li><strong>10m</strong>：Server 記憶體要保存多少 ip 的 request 紀錄</li>
<li><strong>rate=5r/s</strong>：每秒接受 5 個 requests</li>
</ul>
<blockquote>
<p>設定 no-cache 機制</p>
</blockquote>
<p>有時網頁會 cache 到過去的資源，此時你可以在目標路徑下做如下設定</p>
<pre tabindex="0"><code>location / {
 add_header Cache-Control no-cache;
 add_header Cache-Control private;
 try_files $uri $uri/ /index.html;
}
</code></pre><hr>
<h2 id="相關參考資源">相關參考資源<a class="h-anchor" href="#%e7%9b%b8%e9%97%9c%e5%8f%83%e8%80%83%e8%b3%87%e6%ba%90" aria-label="這個段落的連結"></a></h2>
<p><a href="https://blog.longwin.com.tw/2015/12/nginx-ssl-https-ca-setup-rating-a-2015/">Nginx SSL 憑證加分的設定調整</a></p>
<p><a href="https://www.opencli.com/linux/nginx-setup-ssl">Nginx 設定 SSL 網頁加密</a></p>
<p><a href="https://www.sslshopper.com/certificate-key-matcher.html">ssl key比對</a></p>
<p><a href="https://www.sslshopper.com/ssl-checker.html#hostname=https://qa.device_api.ubiqconn.com/">ssl驗證網址</a></p>
<p><a href="https://www.digitalocean.com/community/questions/nginx-ssl-multiple-domains">nginx 轉址(loadbalance)</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Gitlab 安裝以及我曾經遇到的坑</title>
      <link>https://deanlin.net/blog/202006/gitlab-installation-pitfalls/</link>
      <pubDate>Tue, 09 Jun 2020 09:59:21 +0800</pubDate>
      <guid>https://deanlin.net/blog/202006/gitlab-installation-pitfalls/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>Gitlab被各大企業廣泛地用於專案管理上，他可以追蹤每個project的進度設定milestone開sprint、分配不同team相互的權限，甚至在同一個project裡面也能有不同角色的權限區分，CI/CD等功能也能很方便地去實現。</description>
      <media:content url="https://deanlin.net/blog/202006/gitlab-installation-pitfalls/images/gitlab-installation-pitfalls-og_hu_ffea41822b416bcb.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p>Gitlab被各大企業廣泛地用於專案管理上，他可以追蹤每個project的進度設定milestone開sprint、分配不同team相互的權限，甚至在同一個project裡面也能有不同角色的權限區分，CI/CD等功能也能很方便地去實現。</p>
<p>因為過去在使用的路上遇到各式各樣的問題，我把相關經驗整合在這裡，希望看到文章的朋友可以順利跨過這些難關，如果我的文章幫你解決問題歡迎多按幾次拍手。</p>
<p>此Gitlab安裝時的ubuntu版本為16.4，指令如有不同，請自行google，如果你願意，也非常歡迎回覆在下方分享您的經驗。</p>
<blockquote>
<p>建議硬體需求</p>
</blockquote>
<p>RAM至少4GB，以百人公司規模來說建議8GB以上大家使用上會順暢很多(如果你用官方建議2GB可能會連安裝都卡住，這部分有親自體驗過)</p>
<h2 id="安裝前置作業">安裝前置作業<a class="h-anchor" href="#%e5%ae%89%e8%a3%9d%e5%89%8d%e7%bd%ae%e4%bd%9c%e6%a5%ad" aria-label="這個段落的連結"></a></h2>
<ol>
<li>因為git在連線時需要使用ssh連線進行安全性驗證 所以需要openssh-server ca-certificates</li>
<li>gitlab支援寄信通知或是驗證功能所以需要信箱伺服器支援需要postfix</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl openssh-server ca-certificates postfix
</span></span><span style="display:flex;"><span>sudo apt-get install curl openssh-server ca-certificates postfix
</span></span></code></pre></div><h2 id="安裝gitlab">安裝gitlab<a class="h-anchor" href="#%e5%ae%89%e8%a3%9dgitlab" aria-label="這個段落的連結"></a></h2>
<ol>
<li>gitlab下載目前運行版本指令</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
</span></span><span style="display:flex;"><span>sudo apt-get install gitlab-ce<span style="color:#ff7b72;font-weight:bold">=</span>11.1.4-ce.0
</span></span></code></pre></div><p>2. 單純下載封包</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>wget — content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/ubuntu/trusty/gitlab-ce_11.1.4-ce.0_amd64.deb/download.deb
</span></span></code></pre></div><blockquote>
<p>建議要備份下載的deb檔案到自己的硬碟，如果日後災難復原時會用上，像我是備份到公司的NAS Server上面</p>
</blockquote>
<h2 id="gitlab環境配置">gitlab環境配置<a class="h-anchor" href="#gitlab%e7%92%b0%e5%a2%83%e9%85%8d%e7%bd%ae" aria-label="這個段落的連結"></a></h2>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo gitlab-ctl reconfigure
</span></span></code></pre></div><p>如果環境沒問題，上面這個指令會順順的過去；<strong><em>但如果做了版本升級或是降級，所有的環境都可能會產生或大或小的bug</em></strong>，官方並沒有提供一個很健全的解決方案，建議未來的使用者除非很有把握不然建議不要隨意升級。</p>
<blockquote>
<p>筆者在之後新版的gitlab有更新成功，但是舊版直接升級會遇到許多問題整理部份如下</p>
</blockquote>
<p>Gitlab 500 Error: PG::ConnectionBad:</p>
<p><a href="https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1637">https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1637</a></p>
<p>/opt/gitlab/embedded/bin/bundle:23:in `&lt;main&gt;’</p>
<p><a href="https://gitlab.com/gitlab-org/omnibus-gitlab/issues/3185">https://gitlab.com/gitlab-org/omnibus-gitlab/issues/3185</a></p>
<blockquote>
<p>輸入以下指令可獲得版本資訊:</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo gitlab-rake gitlab:env:info
</span></span></code></pre></div><p><img src="https://deanlin.net/blog/202006/gitlab-installation-pitfalls/images/gitlab-installation-pitfalls-01.webp" width="661" height="562" alt="gitlab環境配置（圖 1）" fetchpriority="high" decoding="async"></p>
<h2 id="設定對外網址">設定對外網址<a class="h-anchor" href="#%e8%a8%ad%e5%ae%9a%e5%b0%8d%e5%a4%96%e7%b6%b2%e5%9d%80" aria-label="這個段落的連結"></a></h2>
<p>輸入下面指令後尋找external_url，將其修改成自己的url與開放的port</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo vi /etc/gitlab/gitlab.rb
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>external_url <span style="color:#a5d6ff">&#39;https://domain.com&#39;</span><span style="color:#ff7b72;font-weight:bold">.</span>  <span style="color:#79c0ff">//</span><span style="color:#f85149">你自己的</span>url
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>registry_nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;redirect_http_to_https&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">true</span>   <span style="color:#79c0ff">//</span><span style="color:#f85149">是否自動轉址為</span>https
</span></span><span style="display:flex;"><span>mattermost_nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;redirect_http_to_https&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">true</span>
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;enable&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">true</span>
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;redirect_http_to_https&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">true</span>
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;redirect_http_to_https_port&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">80</span>
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;ssl_certificate&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;/etc/your_path/ssl/gitlab.xxxxx.com.crt&#34;</span>   <span style="color:#79c0ff">//</span><span style="color:#f85149">如果你的</span>gitlab為https請設定ssl的路徑
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;ssl_certificate_key&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;/etc/your_path/ssl/gitlab.xxxxx.com.key&#34;</span>
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/8cfb4e440691d49a32f37be832d27329" rel="noopener">gitlab.rb</a>（GitHub Gist）</p>
<blockquote>
<p>每次修改過這個檔記得要重新配置才會生效</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo gitlab-ctl reconfigure
</span></span></code></pre></div><p>(到這一部已經可以使用gitlab了，但是如果要寄信相關還要做如下設定)</p>
<h2 id="寄信相關設定">寄信相關設定<a class="h-anchor" href="#%e5%af%84%e4%bf%a1%e7%9b%b8%e9%97%9c%e8%a8%ad%e5%ae%9a" aria-label="這個段落的連結"></a></h2>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo vi /etc/gitlab/gitlab.rb
</span></span></code></pre></div><p>把下面這些貼到最下面後sudo gitlab-ctl reconfigure就生效了</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#79c0ff">//</span><span style="color:#f85149">下面的是</span>email信箱設定(<span style="color:#f85149">此為</span>gmail範例)
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_enable&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">true</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_address&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;smtp.gmail.com&#34;</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_port&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">587</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_user_name&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;your@gmail.com&#34;</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_password&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;your_password&#34;</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_domain&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;smtp.gmail.com&#34;</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_authentication&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;login&#34;</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_enable_starttls_auto&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">true</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_tls&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">false</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_openssl_verify_mode&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#39;peer&#39;</span> <span style="color:#8b949e;font-style:italic"># Can be: &#39;none&#39;, &#39;peer&#39;, &#39;client_once&#39;, &#39;fail_if_no_peer_cert&#39;, see http://api.rubyonrails.org/classes/ActionMailer/Base.html</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_ca_path&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;/etc/ssl/certs&#34;</span>
</span></span><span style="display:flex;"><span>gitlab_rails<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;smtp_ca_file&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;/etc/ssl/certs/ca-certificates.crt&#34;</span>
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/16b5ea24384f6fe888cd99722b832ba3" rel="noopener">gitlab_gmail.rb</a>（GitHub Gist）</p>
<p>可下指令測試是否設定成功</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo gitlab-rails console
</span></span><span style="display:flex;"><span>Notify.test_email<span style="color:#ff7b72;font-weight:bold">(</span>‘email@example.com’, ‘test’, ‘test’<span style="color:#ff7b72;font-weight:bold">)</span>.deliver_now
</span></span></code></pre></div><p>但是當gitlab的server有設定雙網卡（同時有內網以及外網）的時候就有可能出現email無法寄送的狀況，這個時候你要確定你外網的優先權必須要高於內網。</p>
<p>看mail錯誤log</p>
<pre tabindex="0"><code>vi /var/log/mail.log
</code></pre><p>改mail postfix設定</p>
<pre tabindex="0"><code>vi /etc/postfix/main.cf
postfix reload
</code></pre><h2 id="ssh對外設定">ssh對外設定<a class="h-anchor" href="#ssh%e5%b0%8d%e5%a4%96%e8%a8%ad%e5%ae%9a" aria-label="這個段落的連結"></a></h2>
<p>如果你對外網址的22 port已經被其他專案佔用了（ex:我公司），所以要將預設ssh的22 port改為轉址的223 port(或是其他你希望的)，一樣是在sudo vi /etc/gitlab/gitlab.rb設定，這樣在gitlab才能用ssh下載</p>
<pre tabindex="0"><code>gitlab_rails[‘gitlab_shell_ssh_port’] = 223
</code></pre><h2 id="nginx設定">nginx設定<a class="h-anchor" href="#nginx%e8%a8%ad%e5%ae%9a" aria-label="這個段落的連結"></a></h2>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;enable&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">true</span>
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;redirect_http_to_https&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#79c0ff">true</span>
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;redirect_http_to_https_port&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">80</span>
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;ssl_certificate&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;/etc/your_path/ssl/gitlab.xxxxx.com.crt&#34;</span>   <span style="color:#79c0ff">//</span><span style="color:#f85149">如果你的</span>gitlab為https請設定ssl的路徑
</span></span><span style="display:flex;"><span>nginx<span style="color:#ff7b72;font-weight:bold">[</span><span style="color:#a5d6ff">&#39;ssl_certificate_key&#39;</span><span style="color:#ff7b72;font-weight:bold">]</span> <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#a5d6ff">&#34;/etc/your_path/ssl/gitlab.xxxxx.com.key&#34;</span>
</span></span></code></pre></div><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/d2485274a4609b5f8ceef16b2db507cc" rel="noopener">gitlab_nginx.rb</a>（GitHub Gist）</p>
<h2 id="讓gitlab可通內網外網">讓Gitlab可通內網外網<a class="h-anchor" href="#%e8%ae%93gitlab%e5%8f%af%e9%80%9a%e5%85%a7%e7%b6%b2%e5%a4%96%e7%b6%b2" aria-label="這個段落的連結"></a></h2>
<p>在gitlab分配兩張網卡後需要完成以下步驟</p>
<blockquote>
<p>先看新增的網卡名稱</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cd /proc/sys/net/ipv4/conf
</span></span></code></pre></div><p>確認完網卡後將他們編輯加入</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo vi /etc/network/interfaces
</span></span><span style="display:flex;"><span>auto ethXXX
</span></span><span style="display:flex;"><span>iface ethXXX inet dhcp
</span></span></code></pre></div><p>改完後</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo /etc/init.d/networking restart
</span></span></code></pre></div><p>用ifconfig查看是不是抓到</p>
<blockquote>
<p>設定路由可以透過閘道連通</p>
</blockquote>
<p>sudo /sbin/route add 10.1.1.1(目標內網ip) gw 10.1.1.254(內網閘道) dev ens192(網卡)</p>
<blockquote>
<p>設定NAS上此共享資料夾必須符合NFS設定可參閱這篇文章</p>
</blockquote>
<p><a href="https://web.archive.org/web/20180906074211/http://blog.xuite.net:80/tolarku/blog/495291815-Qnap&#43;%E8%A8%AD%E5%AE%9A&#43;NFS&#43;%E5%88%86%E4%BA%AB%E8%A8%AD%E5%AE%9A&#43;-&#43;nfs&#43;export" title="原網頁已失效，連到網際網路檔案館的存檔">http://blog.xuite.net/tolarku/blog/495291815-Qnap+%E8%A8%AD%E5%AE%9A+NFS+%E5%88%86%E4%BA%AB%E8%A8%AD%E5%AE%9A+-+nfs+export</a></p>
<blockquote>
<p>確認是否可連通，並觀看有哪些資料夾</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt install nfs-common
</span></span><span style="display:flex;"><span>showmount -e 10.1.1.1<span style="color:#ff7b72;font-weight:bold">(</span>目標內網ip<span style="color:#ff7b72;font-weight:bold">)</span>
</span></span></code></pre></div><blockquote>
<p>將NAS上的共享資料夾掛載到ubuntu上面</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo mount -t nfs 10.1.1.1<span style="color:#ff7b72;font-weight:bold">(</span>目標內網ip<span style="color:#ff7b72;font-weight:bold">)</span>:ServerGit /home/your_path/gitlab_backup
</span></span></code></pre></div><blockquote>
<p>確認是否掛載</p>
</blockquote>
<pre tabindex="0"><code>df -h
</code></pre><h2 id="gitlab定時自動備份到nas的設定">gitlab定時自動備份到NAS的設定<a class="h-anchor" href="#gitlab%e5%ae%9a%e6%99%82%e8%87%aa%e5%8b%95%e5%82%99%e4%bb%bd%e5%88%b0nas%e7%9a%84%e8%a8%ad%e5%ae%9a" aria-label="這個段落的連結"></a></h2>
<p>在/etc/gitlab/gitlab.rb設定gitlab的備份路徑</p>
<pre tabindex="0"><code>gitlab_rails[‘backup_path’]=”/home/your_path/gitlab_backup/”
</code></pre><p>每個月1日創建本月的資料夾的script</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#79c0ff">now_month</span><span style="color:#ff7b72;font-weight:bold">=</span>”<span style="color:#ff7b72">$(</span>date +’%Y%m’<span style="color:#ff7b72">)</span>”
</span></span><span style="display:flex;"><span><span style="color:#8b949e;font-style:italic">#echo “$now_month”</span>
</span></span><span style="display:flex;"><span>cd /home/your_path/gitlab_backup
</span></span><span style="display:flex;"><span>mkdir <span style="color:#79c0ff">$now_month</span>
</span></span></code></pre></div><p>將產生的backup檔案轉移到月份資料夾底下的script,並刪除比較久的資料</p>
<pre tabindex="0"><code>mv /home/your_path/gitlab_backup/*.tar /home/your_path/gitlab_backup/$(date +’%Y%m’)
find /home/your_path/gitlab_backup/$(date +’%Y%m’) -name “*gitlab_backup.tar” -mtime +3 -exec rm -rf {} \;
find /home/your_path/gitlab_backup/$(date “+%Y%m” -d ‘1 month ago’) -name “*gitlab_backup.tar” -mtime +3 -exec rm -rf {} \;
</code></pre><p>排程設定</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo crontab -e
</span></span><span style="display:flex;"><span><span style="color:#a5d6ff">1</span> <span style="color:#a5d6ff">0</span> <span style="color:#a5d6ff">1</span> * * sh /home/your_path/script/mkdir.sh
</span></span><span style="display:flex;"><span><span style="color:#a5d6ff">1</span> <span style="color:#a5d6ff">1</span> * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
</span></span><span style="display:flex;"><span><span style="color:#a5d6ff">1</span> <span style="color:#a5d6ff">2</span> * * * sh /home/your_path/script/mv_to_month.sh
</span></span></code></pre></div><blockquote class="pullquote"><p>Gitlab 的學問博大精深，希望這篇文章讓初學者上手時更加輕鬆。</p>
</blockquote>
]]></content:encoded>
    </item>
  </channel>
</rss>
