<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>운영중입니다</title>
    <link>https://https443.tistory.com/</link>
    <description>기억과 경험을 기록하는 공간입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 10 Jul 2026 23:21:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>https443</managingEditor>
    <image>
      <title>운영중입니다</title>
      <url>https://tistory1.daumcdn.net/tistory/7377671/attach/0a182777b10d4f39a5bc7d9d8725f9f4</url>
      <link>https://https443.tistory.com</link>
    </image>
    <item>
      <title>그누보드5 (Gnuboard5) 설치 방법 정리</title>
      <link>https://https443.tistory.com/45</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-end=&quot;115&quot; data-start=&quot;55&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;서버 사용시 가볍고 빠르게 커뮤니티 사이트를 구축해야 하는 경우가 많습니다.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;222&quot; data-start=&quot;117&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;그누보드5(Gnuboard5)는 국내에서 가장 많이 사용하는 PHP 기반 게시판 솔루션 중 하나로,&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;커뮤니티 / 기업 홈페이지 / 쇼핑몰 / 고객센터 형태까지 다양하게 활용 가능합니다.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;259&quot; data-start=&quot;224&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;이번 글에서는 아래 환경 기준으로 실제 설치 과정을 정리합니다.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;259&quot; data-start=&quot;224&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;259&quot; data-start=&quot;224&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;1. 테스트 환경&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;background-color: #ffffff; color: #333333; text-align: start; border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot; data-start=&quot;828&quot; data-end=&quot;969&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; height: 22px;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; height: 22px;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot; data-start=&quot;850&quot; data-end=&quot;877&quot;&gt;
&lt;td style=&quot;background-color: #efefef; color: #333333; height: 16px;&quot; data-start=&quot;850&quot; data-end=&quot;855&quot; data-col-size=&quot;sm&quot;&gt;OS&lt;/td&gt;
&lt;td style=&quot;color: #333333; height: 16px;&quot; data-start=&quot;855&quot; data-end=&quot;877&quot; data-col-size=&quot;sm&quot;&gt;Ubuntu 24.04.3 LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; color: #333333;&quot;&gt;Web&amp;nbsp;Server&lt;/td&gt;
&lt;td style=&quot;color: #333333;&quot;&gt;Apache 2.4.58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot; data-start=&quot;878&quot; data-end=&quot;895&quot;&gt;
&lt;td style=&quot;background-color: #efefef; color: #333333; height: 16px;&quot; data-start=&quot;878&quot; data-end=&quot;884&quot; data-col-size=&quot;sm&quot;&gt;PHP&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; color: #333333; height: 16px;&quot; data-col-size=&quot;sm&quot; data-start=&quot;884&quot; data-end=&quot;895&quot;&gt;PHP 8.29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-start=&quot;896&quot; data-end=&quot;915&quot;&gt;
&lt;td style=&quot;background-color: #efefef; color: #333333; height: 22px;&quot; data-start=&quot;896&quot; data-end=&quot;904&quot; data-col-size=&quot;sm&quot;&gt;DB&lt;/td&gt;
&lt;td style=&quot;color: #333333; height: 22px;&quot; data-col-size=&quot;sm&quot; data-start=&quot;904&quot; data-end=&quot;915&quot;&gt;MariaDB 10.6.23&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;2. 설치&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.1 그누보드 파일 다운로드&lt;/span&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;공식 홈페이지에서 다운로드: gnuboard5.6.24.tar.gz 다운로드 후 FTP 또는 SFTP로 서버에 업로드합니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.2 wget으로&amp;nbsp;서버에서&amp;nbsp;직접&amp;nbsp;다운로드&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779337215516&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 서버 접속 후
wget https://github.com/gnuboard/gnuboard5/archive/refs/tags/v5.6.24.tar.gz -O gnuboard5.6.24.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.3 압축 해제&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779337256403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tar -xvf gnuboard5.6.24.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;br /&gt;&amp;nbsp; &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.4 웹&amp;nbsp;디렉토리로&amp;nbsp;이동&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779337448514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 예시 Ubuntu Apache 기본 /var/www/html

mv gnuboard5-5.6.24 /var/www/html/gnuboard5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;* 서버 환경 및 사용자 설정에 따라 실제 웹 루트 경로는 다를 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;* Nginx, Apache 가상호스트(VirtualHost) 설정 등에 따라 별도 경로를 사용하는 경우도 있습니다.&lt;/span&gt; &lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-end=&quot;536&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.5 권한 설정&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그누보드는 설치 과정에서 data&amp;nbsp;디렉토리에&amp;nbsp;파일&amp;nbsp;업로드&amp;nbsp;및&amp;nbsp;설정&amp;nbsp;저장이&amp;nbsp;필요합니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2.5.1 data 디렉토리가 없는 경우 &lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1392&quot; data-start=&quot;1357&quot; data-ke-size=&quot;size16&quot;&gt;웹 브라우저 접속 시 아래와 같은 메시지가 출력될 수 있습니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1435&quot; data-start=&quot;1394&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1435&quot; data-start=&quot;1396&quot; data-ke-size=&quot;size16&quot;&gt;다음 파일을 찾을 수 없습니다. data/dbconfig.php&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/maCLi/dJMcabRLOGS/dpPmk8rkKFNgK3QDcHH31K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/maCLi/dJMcabRLOGS/dpPmk8rkKFNgK3QDcHH31K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/maCLi/dJMcabRLOGS/dpPmk8rkKFNgK3QDcHH31K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmaCLi%2FdJMcabRLOGS%2FdpPmk8rkKFNgK3QDcHH31K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1901&quot; height=&quot;509&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779337633033&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#위와 같은 경우 data 디렉토리를 생성합니다.

cd /var/www/html/gnuboard5
mkdir data
chmod 707 data&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp;2.5.2 data 디렉토리가 이미 있는 경우&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779337664841&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /var/www/html/gnuboard5
chmod 707 data
chmod 707 config.php&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292a2e; text-align: start;&quot;&gt;data 디렉토리 생성 후 웹 브라우저에서 새로 고침&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOyx3j/dJMcafzVO9B/1McTer1D060lTCXT6UerT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOyx3j/dJMcafzVO9B/1McTer1D060lTCXT6UerT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOyx3j/dJMcafzVO9B/1McTer1D060lTCXT6UerT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOyx3j%2FdJMcafzVO9B%2F1McTer1D060lTCXT6UerT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1902&quot; height=&quot;601&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; 2.6 정보 입력&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1863&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QibnJ/dJMcag6EJSJ/fBHNeHC3evX8gQ3e3SFZb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QibnJ/dJMcag6EJSJ/fBHNeHC3evX8gQ3e3SFZb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QibnJ/dJMcag6EJSJ/fBHNeHC3evX8gQ3e3SFZb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQibnJ%2FdJMcag6EJSJ%2FfBHNeHC3evX8gQ3e3SFZb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1863&quot; height=&quot;670&quot; data-origin-width=&quot;1863&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;2067&quot; data-start=&quot;2061&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 207px;&quot; border=&quot;1&quot; data-end=&quot;2257&quot; data-start=&quot;2069&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot; data-end=&quot;2111&quot; data-start=&quot;2091&quot;&gt;
&lt;td style=&quot;height: 16px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2098&quot; data-start=&quot;2091&quot;&gt;Host&lt;/td&gt;
&lt;td style=&quot;height: 16px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2111&quot; data-start=&quot;2098&quot;&gt;localhost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;2128&quot; data-start=&quot;2112&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2119&quot; data-start=&quot;2112&quot;&gt;User&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2128&quot; data-start=&quot;2119&quot;&gt;DB 계정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;2151&quot; data-start=&quot;2129&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2140&quot; data-start=&quot;2129&quot;&gt;Password&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2151&quot; data-start=&quot;2140&quot;&gt;DB 비밀번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;2168&quot; data-start=&quot;2152&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2157&quot; data-start=&quot;2152&quot;&gt;DB&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2168&quot; data-start=&quot;2157&quot;&gt;데이터베이스명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;2191&quot; data-start=&quot;2169&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2181&quot; data-start=&quot;2169&quot;&gt;TABLE 접두사&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2191&quot; data-start=&quot;2181&quot;&gt;기본 g5_&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;2212&quot; data-start=&quot;2192&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2201&quot; data-start=&quot;2192&quot;&gt;관리자 ID&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2212&quot; data-start=&quot;2201&quot;&gt;admin 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;2233&quot; data-start=&quot;2213&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2224&quot; data-start=&quot;2213&quot;&gt;관리자 비밀번호&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2233&quot; data-start=&quot;2224&quot;&gt;직접 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot; data-end=&quot;2257&quot; data-start=&quot;2234&quot;&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2244&quot; data-start=&quot;2234&quot;&gt;관리자 이메일&lt;/td&gt;
&lt;td style=&quot;height: 22px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;2257&quot; data-start=&quot;2244&quot;&gt;관리자 메일 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;* 관리자 정보는 이후 그누보드가 설치 된 홈페이지의 관리자 페이지 접속시 사용할 정보입니다.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp;환경 및 사용자 설정에 따라 입력 정보는 다를 수 있습니다.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt; &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;3. 확인&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779338289526&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#도메인 접속
http://도메인주소

#관리자 페이지 
http://도메인주소/adm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mwuFZ/dJMcaja87ln/lD7wASVizzS2SsZKadtVA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mwuFZ/dJMcaja87ln/lD7wASVizzS2SsZKadtVA1/img.png&quot; data-alt=&quot;도메인 입력 후 설치 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mwuFZ/dJMcaja87ln/lD7wASVizzS2SsZKadtVA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmwuFZ%2FdJMcaja87ln%2FlD7wASVizzS2SsZKadtVA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1818&quot; height=&quot;896&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도메인 입력 후 설치 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;4. 유의사항&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt; &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; 4.1&amp;nbsp;Apache&amp;nbsp;+&amp;nbsp;PHP&amp;nbsp;모듈&amp;nbsp;확인&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Ubuntu 환경에서는 PHP 모듈이 부족하면 &lt;/span&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;설치 과정에서 오류가 발생할 수 있습니다.&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779338434518&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#권장 패키지 설치

apt update

apt install -y \
php php-mysql php-gd php-mbstring php-xml \
php-curl php-zip unzip&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;4.2 data 디렉토리 권한 문제 &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779339426576&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#가장 흔한 원인입니다.

chmod 707 data

#확인 필요합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;4.3 &lt;/span&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;PHP&amp;nbsp;버전&amp;nbsp;문제&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779340180693&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#구형 그누보드는 최신 PHP에서 오류가 발생할 수 있습니다.

php -v

# 버전 확인 중요&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;5. 마무리&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;그누보드5는 비교적 간단하게 설치 가능하며, &lt;/span&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;기업 홈페이지, 커뮤니티, 쇼핑몰 등 다양한 형태로 활용하기 좋습니다.&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3575&quot; data-start=&quot;3560&quot; data-ke-size=&quot;size16&quot;&gt;실제 운영 환경에서는 아래 내용을 함께 구성하는 것을 권장합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 132px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 19.1861%; height: 22px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 80.8139%; height: 22px;&quot;&gt;항목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 19.1861%; height: 22px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 80.8139%; height: 22px;&quot;&gt;PHP&amp;nbsp;보안&amp;nbsp;설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 19.1861%; height: 22px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 80.8139%; height: 22px;&quot;&gt;파일&amp;nbsp;업로드&amp;nbsp;제한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 19.1861%; height: 22px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 80.8139%; height: 22px;&quot;&gt;Apache&amp;nbsp;보안&amp;nbsp;설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 19.1861%; height: 22px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 80.8139%; height: 22px; text-align: left;&quot;&gt;SSL&amp;nbsp;적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 19.1861%; height: 22px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 80.8139%; height: 22px;&quot;&gt;백업&amp;nbsp;정책&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>etc</category>
      <category>Apache</category>
      <category>Gnuboard5</category>
      <category>linux</category>
      <category>mariadb</category>
      <category>php</category>
      <category>그누보드</category>
      <category>그누보드설치</category>
      <category>웹서버</category>
      <category>홈페이지</category>
      <category>홈페이지만들기</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/45</guid>
      <comments>https://https443.tistory.com/45#entry45comment</comments>
      <pubDate>Thu, 21 May 2026 20:07:16 +0900</pubDate>
    </item>
    <item>
      <title>FileZilla (파일질라) 구형 서버 접속 오류 해결 방법</title>
      <link>https://https443.tistory.com/44</link>
      <description>&lt;p data-end=&quot;195&quot; data-start=&quot;110&quot; data-ke-size=&quot;size16&quot;&gt;최근 FileZilla 최신 버전으로 업데이트 후 CentOS5 기반의 오래된 서버에 SFTP 접속 시&lt;br /&gt;아래와 같은 오류가 발생하는 경우가 있습니다. 특히 오래된 OpenSSH 버전을 사용하는 서버 환경에서 확인되는 증상입니다.&lt;br /&gt;( Server identification string not terminated by CRLF ) &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZnStq/dJMcabc9X2I/8nl0HkSvADTGqTHDJxNLYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZnStq/dJMcabc9X2I/8nl0HkSvADTGqTHDJxNLYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZnStq/dJMcabc9X2I/8nl0HkSvADTGqTHDJxNLYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZnStq%2FdJMcabc9X2I%2F8nl0HkSvADTGqTHDJxNLYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1263&quot; height=&quot;265&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779258053513&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;상태: 호스트 주소 해석
상태: IP:22에 연결...
오류: Server is in violation of the SSH specifications, it does not terminate its identification string with CRLF. As per RFC 4253 section 4.2 it MUST be terminated by CRLF.
오류: Server identification string not terminated by CRLF
오류: 서버에 연결하지 못함&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;1. 원인&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;663&quot; data-start=&quot;605&quot; data-ke-size=&quot;size16&quot;&gt;해당 오류는 최신 FileZilla가 RFC 4253 규격을 엄격하게 검사하면서 발생하는 현상입니다.&lt;/p&gt;
&lt;p data-end=&quot;763&quot; data-start=&quot;665&quot; data-ke-size=&quot;size16&quot;&gt;구버전 서버의 OpenSSH 환경에서는 SSH 식별 문자열(Identification String) 처리 방식이 최신 규격과 완전히 맞지 않는 경우가 있으며, 최신 FileZilla에서는 이를 비정상 응답으로 판단하여 접속을 차단합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;763&quot; data-start=&quot;665&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;* RFC 4253은 SSH 프로토콜(SSH-2)의 동작 방식을 정의한 공식 인터넷 표준 문서입니다.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;정확한 명칭은 RFC 4253 - The Secure Shell (SSH) Transport Layer Protocol (SSH-2 전송 계층 규격) 이며, &lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;SSH 접속 시 클라이언트(FileZilla, OpenSSH 등)와 서버가 어떻게 통신해야 하는지를 정의합니다.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-end=&quot;763&quot; data-start=&quot;665&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;2. 해결 방안&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-end=&quot;763&quot; data-start=&quot;665&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;파일을&amp;nbsp;수정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1779258394617&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vim /etc/ssh/sshd_config&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-end=&quot;763&quot; data-start=&quot;665&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779258595927&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Port 22
#Protocol 2,1
Protocol 2   -&amp;gt; 주석처리
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F1ud1/dJMcaaZEI0x/SK78mKKKpCWjHu4fGqQcKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F1ud1/dJMcaaZEI0x/SK78mKKKpCWjHu4fGqQcKk/img.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;122&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3794%; margin-right: 10px;&quot; data-widthpercent=&quot;49.96&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F1ud1/dJMcaaZEI0x/SK78mKKKpCWjHu4fGqQcKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF1ud1%2FdJMcaaZEI0x%2FSK78mKKKpCWjHu4fGqQcKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YdmM1/dJMcahkesVH/KAx6kqF5ynM0senk8Ge6D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YdmM1/dJMcahkesVH/KAx6kqF5ynM0senk8Ge6D0/img.png&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;118&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4578%;&quot; data-widthpercent=&quot;50.04&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YdmM1/dJMcahkesVH/KAx6kqF5ynM0senk8Ge6D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYdmM1%2FdJMcahkesVH%2FKAx6kqF5ynM0senk8Ge6D0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; 설정 변경 후 SSH 서비스를 재시작합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1779258706815&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;service sshd restart&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이후 FileZilla 접속이 정상적으로 진행되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;*다만 해당 방법은 서버 환경 및 OpenSSH 버전에 따라 차이가 있을 수 있으며, 모든 서버에서 동일하게 적용되는 것은 아닙니다.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;서버 설정 상태 및 패치 여부에 따라 다른 방식으로 해결이 필요한 경우도 있으므로 참고용으로 확인 바랍니다.&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h1 data-end=&quot;1373&quot; data-start=&quot;1363&quot; data-section-id=&quot;1keo5zq&quot;&gt;sshd_config 설정 설명&lt;/h1&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1807&quot; data-start=&quot;1375&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;설정&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1472&quot; data-start=&quot;1406&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1417&quot; data-start=&quot;1406&quot;&gt;#Port 22&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1429&quot; data-start=&quot;1417&quot;&gt;SSH 접속 포트&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1472&quot; data-start=&quot;1429&quot;&gt;SSH 서비스가 사용할 포트를 지정합니다. 기본값은 22번 포트입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1558&quot; data-start=&quot;1473&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1489&quot; data-start=&quot;1473&quot;&gt;#Protocol 2,1&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1506&quot; data-start=&quot;1489&quot;&gt;SSH 프로토콜 버전 지정&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1558&quot; data-start=&quot;1506&quot;&gt;SSH1 + SSH2 모두 허용하는 오래된 방식입니다. 현재는 거의 사용하지 않습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1610&quot; data-start=&quot;1559&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1573&quot; data-start=&quot;1559&quot;&gt;#Protocol 2&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1584&quot; data-start=&quot;1573&quot;&gt;SSH2만 사용&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1610&quot; data-start=&quot;1584&quot;&gt;SSH2 프로토콜만 허용하는 설정입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1682&quot; data-start=&quot;1611&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1632&quot; data-start=&quot;1611&quot;&gt;#AddressFamily any&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1652&quot; data-start=&quot;1632&quot;&gt;IPv4 / IPv6 사용 여부&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1682&quot; data-start=&quot;1652&quot;&gt;IPv4와 IPv6 모두 사용하도록 허용합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1747&quot; data-start=&quot;1683&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1708&quot; data-start=&quot;1683&quot;&gt;#ListenAddress 0.0.0.0&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1721&quot; data-start=&quot;1708&quot;&gt;IPv4 수신 설정&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1747&quot; data-start=&quot;1721&quot;&gt;모든 IPv4 주소에서 SSH 접속 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1807&quot; data-start=&quot;1748&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1768&quot; data-start=&quot;1748&quot;&gt;#ListenAddress ::&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1781&quot; data-start=&quot;1768&quot;&gt;IPv6 수신 설정&lt;/td&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;1807&quot; data-start=&quot;1781&quot;&gt;모든 IPv6 주소에서 SSH 접속 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;3. 왜 CentOS5 서버만 문제?&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;873&quot; data-start=&quot;836&quot; data-ke-size=&quot;size16&quot;&gt;CentOS5 계열은 매우 오래된 OpenSSH 버전을 사용합니다.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;965&quot; data-start=&quot;883&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;OpenSSH 버전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;938&quot; data-start=&quot;913&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;923&quot; data-start=&quot;913&quot;&gt;CentOS5&lt;/td&gt;
&lt;td data-end=&quot;938&quot; data-start=&quot;923&quot; data-col-size=&quot;sm&quot;&gt;OpenSSH 4.x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;965&quot; data-start=&quot;939&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;948&quot; data-start=&quot;939&quot;&gt;최신 리눅스&lt;/td&gt;
&lt;td data-end=&quot;965&quot; data-start=&quot;948&quot; data-col-size=&quot;sm&quot;&gt;OpenSSH 8~9.x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1055&quot; data-start=&quot;967&quot; data-ke-size=&quot;size16&quot;&gt;구형 OpenSSH는 RFC 규격을 완벽히 지키지 않는 경우가 있으며, 예전 FileZilla는 이를 허용했지만 최신 FileZilla는 엄격하게 검사합니다.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1129&quot; data-start=&quot;1061&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;예전 FileZilla&lt;/td&gt;
&lt;td&gt;최신 FileZilla&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1129&quot; data-start=&quot;1103&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1113&quot; data-start=&quot;1103&quot;&gt;느슨하게 허용&lt;/td&gt;
&lt;td data-end=&quot;1129&quot; data-start=&quot;1113&quot; data-col-size=&quot;sm&quot;&gt;RFC 규격 엄격 검사&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1158&quot; data-start=&quot;1131&quot; data-ke-size=&quot;size16&quot;&gt;이 차이 때문에 갑자기 접속이 안 되는 것으로 예상됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-end=&quot;1158&quot; data-start=&quot;1131&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;4. 왜&amp;nbsp;#Protocol&amp;nbsp;2&amp;nbsp;주석&amp;nbsp;처리하면&amp;nbsp;접속이&amp;nbsp;되나?&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1225&quot; data-start=&quot;1201&quot; data-ke-size=&quot;size16&quot;&gt;CentOS5/OpenSSH 4.x 에서는:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Protocol 2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1304&quot; data-start=&quot;1251&quot; data-ke-size=&quot;size16&quot;&gt;를 명시할 경우 내부 처리 방식이 달라지면서 버전 문자열 처리 문제가 발생하는 사례가 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;#Protocol 2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1414&quot; data-start=&quot;1341&quot; data-ke-size=&quot;size16&quot;&gt;주석 처리시&amp;nbsp; 기본값(default) 사용 상태가 되는데, 구형 OpenSSH에서는 이 상태가 오히려 최신 클라이언트와 호환되는 경우가 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1516&quot; data-start=&quot;1427&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;설정&lt;/td&gt;
&lt;td&gt;설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1478&quot; data-start=&quot;1449&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1464&quot; data-start=&quot;1449&quot;&gt;Protocol 2&lt;/td&gt;
&lt;td data-end=&quot;1478&quot; data-start=&quot;1464&quot; data-col-size=&quot;sm&quot;&gt;강제 SSH2 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1516&quot; data-start=&quot;1479&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1495&quot; data-start=&quot;1479&quot;&gt;#Protocol 2&lt;/td&gt;
&lt;td data-end=&quot;1516&quot; data-start=&quot;1495&quot; data-col-size=&quot;sm&quot;&gt;기본값 사용 (대부분 SSH2)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;5. 마무리&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;이번 문제는 FileZilla 자체의 오류라기보다는, 최신 클라이언트와 구형 서버 간 SSH 규격(RFC 4253) 호환성 문제에 가까운 사례입니다.&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가장 권장되는 방법은 신규 서버 환경으로 이전하는 것이나, 오래된 서버나 레거시 시스템의 경우 현실적으로 즉시 변경이 어려운 경우도 많습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;특히 최근 FileZilla 업데이트 이후 동일한 접속 오류가 발생할 수 있으므로, 유사한 환경을 운영 중이라면 참고하시면 도움이 될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>etc</category>
      <category>centos5</category>
      <category>FileZilla</category>
      <category>FileZilla오류</category>
      <category>FTP</category>
      <category>linux</category>
      <category>RFC4253</category>
      <category>sftp</category>
      <category>SFTP오류</category>
      <category>SSH오류</category>
      <category>파일질라</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/44</guid>
      <comments>https://https443.tistory.com/44#entry44comment</comments>
      <pubDate>Wed, 20 May 2026 21:23:52 +0900</pubDate>
    </item>
    <item>
      <title>Postfix + PHPMailer 메일 발송 시스템을 웹 UI로 사용하는 방법</title>
      <link>https://https443.tistory.com/43</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt; &lt;a href=&quot;https://https443.tistory.com/42&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://https443.tistory.com/42&lt;/a&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;이전 글에서는 Ubuntu 24.04 환경에서 Postfix와 PHPMailer를 이용하여&lt;br /&gt;CLI(Command Line) 기반으로 동일한 메일을 여러 사용자에게 발송하는 방법을 정리하였습니다.&lt;br /&gt;&lt;br /&gt;이번&amp;nbsp;글에서는&amp;nbsp;해당&amp;nbsp;내용을&amp;nbsp;확장하여&lt;br /&gt;웹&amp;nbsp;브라우저에서&amp;nbsp;직접&amp;nbsp;수신자&amp;nbsp;목록&amp;nbsp;관리,&amp;nbsp;제목&amp;nbsp;수정,&amp;nbsp;테스트&amp;nbsp;발송,&amp;nbsp;전체&amp;nbsp;발송까지&amp;nbsp;가능한&lt;br /&gt;간단한 메일 발송 UI를 만드는 방법을 정리합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;1. 테스트 환경&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 106px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 25.9302%; height: 21px;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 74.0698%; height: 21px;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.9302%; height: 17px;&quot;&gt;OS&lt;/td&gt;
&lt;td style=&quot;width: 74.0698%; height: 17px;&quot;&gt;Ubuntu&amp;nbsp;24.04.2&amp;nbsp;LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.9302%; height: 17px;&quot;&gt;Apache&lt;/td&gt;
&lt;td style=&quot;width: 74.0698%; height: 17px;&quot;&gt;Apache/2.4.58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.9302%; height: 17px;&quot;&gt;PHP&lt;/td&gt;
&lt;td style=&quot;width: 74.0698%; height: 17px;&quot;&gt;PHP&amp;nbsp;8.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.9302%; height: 17px;&quot;&gt;메일&amp;nbsp;발송&lt;/td&gt;
&lt;td style=&quot;width: 74.0698%; height: 17px;&quot;&gt;Postfix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.9302%; height: 17px;&quot;&gt;메일&amp;nbsp;라이브러리&lt;/td&gt;
&lt;td style=&quot;width: 74.0698%; height: 17px;&quot;&gt;PHPMailer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779153214351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Apache 기본 웹 경로는 일반적으로 아래와 같습니다.

/var/www/html

#서버마다 다를 수 있으므로 실제 환경에 맞게 확인이 필요합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;2. 생성&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;2.1 기존&amp;nbsp;CLI&amp;nbsp;메일&amp;nbsp;발송&amp;nbsp;프로젝트&amp;nbsp;복사&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779153391390&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#이전 글에서 사용한 /root/mailtest 디렉토리를 웹에서 접근 가능한 경로로 복사합니다.

mkdir -p /var/www/html/mailtest

cp -a /root/mailtest/* /var/www/html/mailtest/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;2.2 웹&amp;nbsp;수정&amp;nbsp;가능하도록&amp;nbsp;권한&amp;nbsp;설정&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779153461629&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chown -R www-data:www-data /var/www/html/mailtest

chmod 755 /var/www/html/mailtest

chmod 644 /var/www/html/mailtest/maillist.txt

chmod 644 /var/www/html/mailtest/send_mail_sent.json 2&amp;gt;/dev/null

# 644로 설정 후 실행이 안될 경우 666을 설정하나 666은 소유자, 그룹, 전체 
# 모두 읽고 쓰기가 가능하므로, 임시로 사용하거나 644를 사용합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;&amp;nbsp;&lt;b&gt;&lt;i&gt; 2.3 index.php&amp;nbsp;생성&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779154307264&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#메일 발송 UI는 단일 PHP 파일로 구성하였습니다.

cd /var/www/html/mailtest

vim index.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779155132876&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
session_start();
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require __DIR__ . '/PHPMailer/src/Exception.php';
require __DIR__ . '/PHPMailer/src/PHPMailer.php';
require __DIR__ . '/PHPMailer/src/SMTP.php';
date_default_timezone_set(&quot;Asia/Seoul&quot;);
/*
|--------------------------------------------------------------------------
| 관리자 / SMTP 설정
|--------------------------------------------------------------------------
*/
$adminPassword = &quot;비빌번호 설정&quot;;
$smtpHost = &quot;사용 메일 서버&quot;;
$smtpPort = 465;
$smtpUser = &quot;사용 메일 계정&quot;;
$smtpPass = &quot;사용 메일 계정 비밀번호&quot;;
$fromEmail = &quot;발송 주소&quot;;
$fromName  = &quot;발송자명&quot;;
/*
|--------------------------------------------------------------------------
| 파일 설정
|--------------------------------------------------------------------------
*/
$mailListFile = __DIR__ . &quot;/maillist.txt&quot;;
$sentFile     = __DIR__ . &quot;/send_mail_sent.json&quot;;
$lockFile     = __DIR__ . &quot;/send_mail.lock&quot;;
/*
|--------------------------------------------------------------------------
| 로그인 처리
|--------------------------------------------------------------------------
*/
if (isset($_POST['login_password'])) {
    if ($_POST['login_password'] === $adminPassword) {
        $_SESSION['login'] = true;
        header(&quot;Location: index.php&quot;);
        exit;
    } else {
        $loginError = &quot;비밀번호가 올바르지 않습니다.&quot;;
    }
}
if (isset($_GET['logout'])) {
    session_destroy();
    header(&quot;Location: index.php&quot;);
    exit;
}
if (empty($_SESSION['login'])) {
?&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;메일 발송 관리자&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body { font-family: Arial, &quot;Malgun Gothic&quot;, sans-serif; background:#f3f4f6; }
.login-box { width:360px; margin:120px auto; background:#fff; padding:30px; border-radius:12px; box-shadow:0 4px 14px rgba(0,0,0,.1); }
input { width:100%; padding:12px; box-sizing:border-box; margin-top:10px; }
button { width:100%; padding:12px; margin-top:15px; background:#1d4ed8; color:#fff; border:0; border-radius:6px; cursor:pointer; }
.error { color:red; margin-top:10px; }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;login-box&quot;&amp;gt;
    &amp;lt;h2&amp;gt;메일 발송 관리자&amp;lt;/h2&amp;gt;
    &amp;lt;form method=&quot;post&quot;&amp;gt;
        &amp;lt;input type=&quot;password&quot; name=&quot;login_password&quot; placeholder=&quot;관리자 비밀번호&quot;&amp;gt;
        &amp;lt;button type=&quot;submit&quot;&amp;gt;로그인&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;lt;?php if (!empty($loginError)) echo '&amp;lt;div class=&quot;error&quot;&amp;gt;'.$loginError.'&amp;lt;/div&amp;gt;'; ?&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&amp;lt;?php
exit;
}
/*
|--------------------------------------------------------------------------
| 기본값
|--------------------------------------------------------------------------
*/
$currentMailList = file_exists($mailListFile) ? file_get_contents($mailListFile) : &quot;&quot;;
$subject = $_POST['subject'] ?? &quot;&quot;;
$body    = $_POST['body'] ?? &quot;&quot;;
$message = &quot;&quot;;
$results = [];
/*
|--------------------------------------------------------------------------
| 수신자 목록 저장
|--------------------------------------------------------------------------
*/
if (isset($_POST['save_maillist'])) {
    file_put_contents($mailListFile, trim($_POST['maillist']) . &quot;\n&quot;);
    $currentMailList = file_get_contents($mailListFile);
    $message = &quot;수신자 목록이 저장되었습니다.&quot;;
}
/*
|--------------------------------------------------------------------------
| 발송 기록 초기화
|--------------------------------------------------------------------------
*/
if (isset($_POST['reset_sent'])) {
    if (file_exists($sentFile)) {
        unlink($sentFile);
    }
    $message = &quot;발송 기록이 초기화되었습니다.&quot;;
}
/*
|--------------------------------------------------------------------------
| 발송 함수
|--------------------------------------------------------------------------
*/
function sendMailOne(
    $to,
    $subject,
    $body,
    $smtpHost,
    $smtpPort,
    $smtpUser,
    $smtpPass,
    $fromEmail,
    $fromName
) {
    $mail = new PHPMailer(true);
    $mail-&amp;gt;isSMTP();
    $mail-&amp;gt;Host       = $smtpHost;
    $mail-&amp;gt;SMTPAuth   = true;
    $mail-&amp;gt;Username   = $smtpUser;
    $mail-&amp;gt;Password   = $smtpPass;
    $mail-&amp;gt;SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail-&amp;gt;Port       = $smtpPort;
    $mail-&amp;gt;CharSet = &quot;UTF-8&quot;;
    $mail-&amp;gt;setFrom($fromEmail, $fromName);
    $mail-&amp;gt;addAddress($to);
    $mail-&amp;gt;Subject = $subject;
    $mail-&amp;gt;isHTML(true);
    $mail-&amp;gt;Body = nl2br($body);
    $mail-&amp;gt;AltBody = strip_tags($body);
    $mail-&amp;gt;send();
}
/*
|--------------------------------------------------------------------------
| 발송 처리
|--------------------------------------------------------------------------
*/
if (isset($_POST['send_test']) || isset($_POST['send_all'])) {
    $subject = trim($_POST['subject'] ?? &quot;&quot;);
    $body    = trim($_POST['body'] ?? &quot;&quot;);
    if ($subject === &quot;&quot;) {
        $results[] = &quot;[FAIL] 제목이 비어 있습니다.&quot;;
    }
    if ($body === &quot;&quot;) {
        $results[] = &quot;[FAIL] 본문이 비어 있습니다.&quot;;
    }
    if (empty($results)) {
        $lockHandle = fopen($lockFile, &quot;c&quot;);
        if (!$lockHandle) {
            $results[] = &quot;[FAIL] 잠금 파일 생성 실패&quot;;
        } elseif (!flock($lockHandle, LOCK_EX | LOCK_NB)) {
            $results[] = &quot;[FAIL] 이미 발송 작업이 실행 중입니다.&quot;;
        } else {
            $sentList = [];
            if (file_exists($sentFile)) {
                $sentList = json_decode(file_get_contents($sentFile), true);
                if (!is_array($sentList)) {
                    $sentList = [];
                }
            }
            if (isset($_POST['send_test'])) {
                $targetList = [trim($_POST['test_email'])];
            } else {
                $targetList = file($mailListFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
                $targetList = array_unique($targetList);
            }
            foreach ($targetList as $to) {
                $to = trim($to);
                if (!$to) {
                    continue;
                }
                if (!filter_var($to, FILTER_VALIDATE_EMAIL)) {
                    $results[] = &quot;[SKIP] 잘못된 이메일 주소: {$to}&quot;;
                    continue;
                }
                if (isset($_POST['send_all']) &amp;amp;&amp;amp; isset($sentList[$to])) {
                    $results[] = &quot;[SKIP] 이미 발송 완료: {$to}&quot;;
                    continue;
                }
                try {
                    sendMailOne(
                        $to,
                        $subject,
                        $body,
                        $smtpHost,
                        $smtpPort,
                        $smtpUser,
                        $smtpPass,
                        $fromEmail,
                        $fromName
                    );
                    if (isset($_POST['send_all'])) {
                        $sentList[$to] = [
                            &quot;sent_at&quot; =&amp;gt; date(&quot;Y-m-d H:i:s&quot;),
                            &quot;subject&quot; =&amp;gt; $subject
                        ];
                        file_put_contents(
                            $sentFile,
                            json_encode($sentList, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT),
                            LOCK_EX
                        );
                    }
                    $results[] = &quot;[OK] 발송 완료: {$to}&quot;;
                } catch (Exception $e) {
                    $results[] = &quot;[FAIL] {$to} / &quot; . $e-&amp;gt;getMessage();
                }
                sleep(2);
            }
            flock($lockHandle, LOCK_UN);
            fclose($lockHandle);
        }
    }
}
/*
|--------------------------------------------------------------------------
| 발송 완료 건수
|--------------------------------------------------------------------------
*/
$sentCount = 0;
if (file_exists($sentFile)) {
    $tmp = json_decode(file_get_contents($sentFile), true);
    if (is_array($tmp)) {
        $sentCount = count($tmp);
    }
}
?&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;메일 발송 관리자&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body {
    font-family: Arial, &quot;Malgun Gothic&quot;, sans-serif;
    background:#f4f6f9;
    margin:0;
    padding:30px;
    color:#111;
}
.container {
    max-width:1200px;
    margin:0 auto;
}
.header {
    display:flex;
    justify-content:space-between;
    align-items:center;
    margin-bottom:20px;
}
.card {
    background:#fff;
    padding:24px;
    border-radius:14px;
    box-shadow:0 4px 14px rgba(0,0,0,.08);
    margin-bottom:20px;
}
h1, h2 {
    margin-top:0;
}
textarea,
input[type=&quot;text&quot;],
input[type=&quot;email&quot;] {
    width:100%;
    box-sizing:border-box;
    padding:12px;
    border:1px solid #ccc;
    border-radius:8px;
    font-family:Consolas, &quot;Malgun Gothic&quot;, sans-serif;
}
textarea {
    min-height:220px;
}
.body-area {
    min-height:420px;
}
button {
    padding:12px 18px;
    border:0;
    border-radius:8px;
    cursor:pointer;
    font-weight:bold;
}
.btn-blue { background:#1d4ed8; color:#fff; }
.btn-green { background:#15803d; color:#fff; }
.btn-red { background:#dc2626; color:#fff; }
.btn-gray { background:#555; color:#fff; }
.result {
    background:#111827;
    color:#fff;
    padding:15px;
    border-radius:10px;
    white-space:pre-line;
}
.notice {
    background:#ecfdf5;
    border:1px solid #bbf7d0;
    padding:12px;
    border-radius:8px;
    margin-bottom:15px;
}
.row {
    display:grid;
    grid-template-columns:1fr 1fr;
    gap:20px;
}
.small {
    color:#666;
    font-size:13px;
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;
    &amp;lt;div class=&quot;header&quot;&amp;gt;
        &amp;lt;h1&amp;gt;메일 발송 관리자&amp;lt;/h1&amp;gt;
        &amp;lt;a href=&quot;?logout=1&quot;&amp;gt;로그아웃&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;?php if ($message): ?&amp;gt;
        &amp;lt;div class=&quot;notice&quot;&amp;gt;&amp;lt;?php echo htmlspecialchars($message); ?&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;?php endif; ?&amp;gt;
    &amp;lt;div class=&quot;card&quot;&amp;gt;
        &amp;lt;h2&amp;gt;발송 상태&amp;lt;/h2&amp;gt;
        &amp;lt;p&amp;gt;발송 완료 기록: &amp;lt;b&amp;gt;&amp;lt;?php echo $sentCount; ?&amp;gt;&amp;lt;/b&amp;gt;건&amp;lt;/p&amp;gt;
        &amp;lt;form method=&quot;post&quot; onsubmit=&quot;return confirm('발송 기록을 초기화하시겠습니까? 이미 보낸 주소도 다시 발송 가능해집니다.');&quot;&amp;gt;
            &amp;lt;button type=&quot;submit&quot; name=&quot;reset_sent&quot; class=&quot;btn-red&quot;&amp;gt;발송 기록 초기화&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;card&quot;&amp;gt;
        &amp;lt;h2&amp;gt;수신자 목록&amp;lt;/h2&amp;gt;
        &amp;lt;p class=&quot;small&quot;&amp;gt;한 줄에 이메일 주소 1개씩 입력합니다.&amp;lt;/p&amp;gt;
        &amp;lt;form method=&quot;post&quot;&amp;gt;
            &amp;lt;textarea name=&quot;maillist&quot;&amp;gt;&amp;lt;?php echo htmlspecialchars($currentMailList); ?&amp;gt;&amp;lt;/textarea&amp;gt;
            &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;button type=&quot;submit&quot; name=&quot;save_maillist&quot; class=&quot;btn-blue&quot;&amp;gt;수신자 목록 저장&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;form method=&quot;post&quot; id=&quot;sendForm&quot;&amp;gt;
        &amp;lt;div class=&quot;card&quot;&amp;gt;
            &amp;lt;h2&amp;gt;메일 제목&amp;lt;/h2&amp;gt;
            &amp;lt;input type=&quot;text&quot; name=&quot;subject&quot; value=&quot;&amp;lt;?php echo htmlspecialchars($subject); ?&amp;gt;&quot; placeholder=&quot;메일 제목을 입력하세요&quot;&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;card&quot;&amp;gt;
            &amp;lt;h2&amp;gt;메일 본문&amp;lt;/h2&amp;gt;
            &amp;lt;p class=&quot;small&quot;&amp;gt;줄바꿈은 메일에서도 그대로 적용됩니다. HTML 태그를 직접 입력해도 됩니다.&amp;lt;/p&amp;gt;
            &amp;lt;textarea name=&quot;body&quot; class=&quot;body-area&quot; placeholder=&quot;발송할 메일 내용을 입력하세요&quot;&amp;gt;&amp;lt;?php echo htmlspecialchars($body); ?&amp;gt;&amp;lt;/textarea&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;row&quot;&amp;gt;
            &amp;lt;div class=&quot;card&quot;&amp;gt;
                &amp;lt;h2&amp;gt;테스트 발송&amp;lt;/h2&amp;gt;
                &amp;lt;input type=&quot;email&quot; name=&quot;test_email&quot; placeholder=&quot;테스트 받을 이메일 주소&quot;&amp;gt;
                &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
                &amp;lt;button type=&quot;submit&quot; name=&quot;send_test&quot; class=&quot;btn-green&quot;&amp;gt;테스트 발송&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;card&quot;&amp;gt;
                &amp;lt;h2&amp;gt;전체 발송&amp;lt;/h2&amp;gt;
                &amp;lt;p class=&quot;small&quot;&amp;gt;수신자 목록에 저장된 주소 기준으로 1명씩 개별 발송됩니다.&amp;lt;/p&amp;gt;
                &amp;lt;button type=&quot;submit&quot; name=&quot;send_all&quot; class=&quot;btn-red&quot; onclick=&quot;return confirm('전체 발송하시겠습니까?');&quot;&amp;gt;전체 발송&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;lt;?php if (!empty($results)): ?&amp;gt;
        &amp;lt;div class=&quot;card&quot;&amp;gt;
            &amp;lt;h2&amp;gt;발송 결과&amp;lt;/h2&amp;gt;
            &amp;lt;div class=&quot;result&quot;&amp;gt;&amp;lt;?php echo htmlspecialchars(implode(&quot;\n&quot;, $results)); ?&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;?php endif; ?&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;3. 주요 기능&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2038&quot; data-start=&quot;1751&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;기능&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1797&quot; data-start=&quot;1773&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1782&quot; data-start=&quot;1773&quot;&gt;로그인 기능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1797&quot; data-start=&quot;1782&quot;&gt;관리자 비밀번호 인증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1826&quot; data-start=&quot;1798&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1810&quot; data-start=&quot;1798&quot;&gt;수신자 목록 관리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1826&quot; data-start=&quot;1810&quot;&gt;웹에서 직접 수정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1853&quot; data-start=&quot;1827&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1836&quot; data-start=&quot;1827&quot;&gt;테스트 발송&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1853&quot; data-start=&quot;1836&quot;&gt;특정 주소로 테스트 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1877&quot; data-start=&quot;1854&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1862&quot; data-start=&quot;1854&quot;&gt;전체 발송&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1877&quot; data-start=&quot;1862&quot;&gt;목록 기준 개별 발송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1903&quot; data-start=&quot;1878&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1889&quot; data-start=&quot;1878&quot;&gt;발송 기록 저장&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1903&quot; data-start=&quot;1889&quot;&gt;JSON 파일 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1930&quot; data-start=&quot;1904&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1915&quot; data-start=&quot;1904&quot;&gt;중복 발송 방지&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1930&quot; data-start=&quot;1915&quot;&gt;이미 보낸 주소 제외&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1953&quot; data-start=&quot;1931&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1943&quot; data-start=&quot;1931&quot;&gt;발송 기록 초기화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1953&quot; data-start=&quot;1943&quot;&gt;재발송 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1976&quot; data-start=&quot;1954&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1964&quot; data-start=&quot;1954&quot;&gt;lock 처리&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1976&quot; data-start=&quot;1964&quot;&gt;중복 실행 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2004&quot; data-start=&quot;1977&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1985&quot; data-start=&quot;1977&quot;&gt;제목 수정&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2004&quot; data-start=&quot;1985&quot;&gt;웹 UI에서 즉시 변경 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2038&quot; data-start=&quot;2005&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2018&quot; data-start=&quot;2005&quot;&gt;HTML 메일 지원&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2038&quot; data-start=&quot;2018&quot;&gt;줄바꿈 및 HTML 적용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; 3.1 로그인 화면&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dng6Kq/dJMcaaZDv8C/nHVOpKunQhKfAvk4XVGT1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dng6Kq/dJMcaaZDv8C/nHVOpKunQhKfAvk4XVGT1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dng6Kq/dJMcaaZDv8C/nHVOpKunQhKfAvk4XVGT1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdng6Kq%2FdJMcaaZDv8C%2FnHVOpKunQhKfAvk4XVGT1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;448&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1779156148846&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 비밀번호는 위에 기입 된 코드 내부에서 직접 설정합니다.

$adminPassword = &quot;비밀번호 설정&quot;;

# 실제 운영 환경에서는 아래 사항도 함께 적용하는 것이 좋습니다.

#HTTPS 적용, 관리자 IP 제한, 세션 타임아웃, .htaccess 접근 제한 등&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;3.2 메일&amp;nbsp;발송&amp;nbsp;관리자&amp;nbsp;화면&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;2332&quot; data-start=&quot;2306&quot; data-ke-size=&quot;size16&quot;&gt;로그인 후에는 메일 발송 관리 화면이 출력됩니다. 현재 UI에서는 아래 기능을 웹에서 직접 처리 할 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 168px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 21px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 21px;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 21px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 21px;&quot;&gt;수신자&amp;nbsp;목록&amp;nbsp;저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 21px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 21px;&quot;&gt;제목&amp;nbsp;수정 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 21px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 21px;&quot;&gt;본문&amp;nbsp;수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 21px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 21px;&quot;&gt;테스트&amp;nbsp;발송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 21px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 21px;&quot;&gt;전체&amp;nbsp;발송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 21px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 21px;&quot;&gt;발송&amp;nbsp;결과&amp;nbsp;확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 16.1628%; height: 21px;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;width: 83.8372%; height: 21px;&quot;&gt;발송&amp;nbsp;기록&amp;nbsp;초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfBN0n/dJMb997vnxb/12RsNftSh613L5ScppPYbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfBN0n/dJMb997vnxb/12RsNftSh613L5ScppPYbK/img.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;721&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.4997%; margin-right: 10px;&quot; data-widthpercent=&quot;48.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfBN0n/dJMb997vnxb/12RsNftSh613L5ScppPYbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfBN0n%2FdJMb997vnxb%2F12RsNftSh613L5ScppPYbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1038&quot; height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbFRSg/dJMcai4nP4u/Yd1UFj7lWvBkhgVyMUQZD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbFRSg/dJMcai4nP4u/Yd1UFj7lWvBkhgVyMUQZD0/img.png&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;768&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.3375%;&quot; data-widthpercent=&quot;51.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbFRSg/dJMcai4nP4u/Yd1UFj7lWvBkhgVyMUQZD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbFRSg%2FdJMcai4nP4u%2FYd1UFj7lWvBkhgVyMUQZD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1195&quot; height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;3.3 발송 기록 저장 방식, 중복 실행 방지(lock), 스팸 판정 완화 &lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779158610746&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#발송 완료 주소는 JSON 파일로 저장
# 해당 코드로  이미 발송한 주소를 자동 제외할 수 있습니다.

{
  &quot;user@example.com&quot;: {
    &quot;sent_at&quot;: &quot;2026-05-18 13:00:00&quot;,
    &quot;subject&quot;: &quot;안내 메일&quot;
  }
}


#---------------------------------------------------------------------------------------------


#발송 중 중복 실행되는 상황을 막기 위해 lock 파일 기반 처리도 추가하였습니다.
# * 락(lock) 방식은 특정 작업이 실행 중일 때 잠금 상태를 만들어 동일 작업이 동시에 중복 실행되지 않도록 막는 처리 방식입니다.


$lockFile = __DIR__ . &quot;/send_mail.lock&quot;;


#---------------------------------------------------------------------------------------------

#메일 서버에서 너무 빠르게 대량 발송하면 스팸 판정을 받을 가능성이 높아질 수 있습니다.
#이에 발송 간 간단한 딜레이를 추가하였습니다.

sleep(2);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp; 4. 마무리&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;125&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;기존 CLI 기반의 Postfix + PHPMailer 메일 발송 시스템을 웹 UI 형태로 확장할 경우,&lt;br /&gt;관리 편의성과 사용성이 크게 향상되며, PHP 단일 파일만으로도 비교적 간단하게 구성할 수 있다는 장점이 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;219&quot; data-start=&quot;127&quot; data-ke-size=&quot;size16&quot;&gt;다만 일부 권한 설정 및 SMTP 정보 관리 방식에 따라 보안상 취약점이 발생할 수 있으므로,&lt;br /&gt;운영 환경에서는 권한 관리 및 접근 제어 설정에 주의가 필요합니다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>etc</category>
      <category>php</category>
      <category>phpmailer</category>
      <category>postfix</category>
      <category>SMTP설정</category>
      <category>ubuntu</category>
      <category>리눅스서버</category>
      <category>메일발송시스템</category>
      <category>메일자동발송</category>
      <category>서버운영</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/43</guid>
      <comments>https://https443.tistory.com/43#entry43comment</comments>
      <pubDate>Tue, 19 May 2026 20:07:25 +0900</pubDate>
    </item>
    <item>
      <title>Postfix + PHPMailer로 동일한 메일 여러 사용자에게 발송하는 방법</title>
      <link>https://https443.tistory.com/42</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;웹&amp;nbsp;서버를&amp;nbsp;운영하다&amp;nbsp;보면&lt;br /&gt;공지사항이나 보안 관련 안내 메일을 여러 사용자에게 안정적으로 발송해야 하는 경우가 많습니다.&lt;br /&gt;&lt;br /&gt;이번 글에서는 Ubuntu 24.04 환경에서 Postfix와 PHPMailer를 이용하여 여러&amp;nbsp;사용자에게&amp;nbsp;&lt;br /&gt;동일한 메일을 자동 발송하는 방법을 정리하였습니다.&lt;br /&gt;&lt;br /&gt;특히 아래 사항들을 고려하여 실제 운영 환경 기준으로 구성하였습니다.&lt;br /&gt;&lt;br /&gt;- 다수 사용자 개별 발송&lt;br /&gt;- 중복 발송 방지&lt;br /&gt;- 스팸 판정 완화&lt;br /&gt;- 발송 기록 저장&lt;br /&gt;- 재실행 방지(lock)&lt;br /&gt;- PHP 기반 간단 구성&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;s&gt;※ 본 글은 테스트 및 운영 경험을 기반으로 정리한 내용입니다.&lt;/s&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;1. Postfix, PHPMailer 란?&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;301&quot; data-start=&quot;226&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;Postfix&lt;/span&gt;&lt;/span&gt;&lt;/b&gt; 는 리눅스 서버에서 사용하는 대표적인 메일 서버(MTA)입니다.&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;* Mail Transfer Agent (MTA)는 메일을 다른 서버로 전달하는 프로그램을 의미 &lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;341&quot; data-start=&quot;312&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;319&quot; data-start=&quot;312&quot; data-section-id=&quot;b1vorh&quot;&gt;메일 발송&lt;/li&gt;
&lt;li data-end=&quot;327&quot; data-start=&quot;320&quot; data-section-id=&quot;b20cm0&quot;&gt;메일 수신&lt;/li&gt;
&lt;li data-end=&quot;341&quot; data-start=&quot;328&quot; data-section-id=&quot;4tkdyg&quot;&gt;외부 메일 서버 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;353&quot; data-start=&quot;343&quot; data-ke-size=&quot;size16&quot;&gt;역할을 담당합니다. 즉, 서버에서 실제로 메일을 인터넷으로 보내주는 프로그램입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;413&quot; data-start=&quot;397&quot; data-section-id=&quot;oxazse&quot; data-ke-size=&quot;size26&quot;&gt;Postfix 주요 특징&lt;/h2&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;563&quot; data-start=&quot;415&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody data-end=&quot;563&quot; data-start=&quot;437&quot;&gt;
&lt;tr data-end=&quot;456&quot; data-start=&quot;437&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;442&quot; data-start=&quot;437&quot;&gt;종류&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;456&quot; data-start=&quot;442&quot;&gt;메일 서버(MTA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;484&quot; data-start=&quot;457&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;465&quot; data-start=&quot;457&quot;&gt;사용 환경&lt;/td&gt;
&lt;td data-end=&quot;484&quot; data-start=&quot;465&quot; data-col-size=&quot;sm&quot;&gt;Ubuntu / CentOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;506&quot; data-start=&quot;485&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;490&quot; data-start=&quot;485&quot;&gt;특징&lt;/td&gt;
&lt;td data-end=&quot;506&quot; data-start=&quot;490&quot; data-col-size=&quot;sm&quot;&gt;빠름, 가벼움, 안정성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;529&quot; data-start=&quot;507&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;515&quot; data-start=&quot;507&quot;&gt;주요 역할&lt;/td&gt;
&lt;td data-end=&quot;529&quot; data-start=&quot;515&quot; data-col-size=&quot;sm&quot;&gt;SMTP 메일 발송&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;563&quot; data-start=&quot;530&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;538&quot; data-start=&quot;530&quot;&gt;사용 목적&lt;/td&gt;
&lt;td data-end=&quot;563&quot; data-start=&quot;538&quot; data-col-size=&quot;sm&quot;&gt;시스템 메일, 웹메일, 공지 메일 발송&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;745&quot; data-start=&quot;732&quot; data-section-id=&quot;1hma8wf&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-end=&quot;826&quot; data-start=&quot;747&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PHPMailer&lt;/b&gt;는 PHP에서 메일을 쉽게 발송할 수 있도록 도와주는 라이브러리입니다.&lt;/p&gt;
&lt;p data-end=&quot;888&quot; data-start=&quot;828&quot; data-ke-size=&quot;size16&quot;&gt;PHP 기본 mail 함수보다 훨씬 편리하며, 실무에서는 대부분 PHPMailer를 많이 사용합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;913&quot; data-start=&quot;895&quot; data-section-id=&quot;l3dfu6&quot; data-ke-size=&quot;size26&quot;&gt;PHPMailer 주요 기능&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;기능지원 여부
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1038&quot; data-start=&quot;915&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody data-end=&quot;1038&quot; data-start=&quot;940&quot;&gt;
&lt;tr data-end=&quot;955&quot; data-start=&quot;940&quot;&gt;
&lt;td style=&quot;width: 49.7674%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;950&quot; data-start=&quot;940&quot;&gt;HTML 메일&lt;/td&gt;
&lt;td style=&quot;width: 50.1163%;&quot; data-end=&quot;955&quot; data-start=&quot;950&quot; data-col-size=&quot;sm&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;968&quot; data-start=&quot;956&quot;&gt;
&lt;td style=&quot;width: 49.7674%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;963&quot; data-start=&quot;956&quot;&gt;첨부파일&lt;/td&gt;
&lt;td style=&quot;width: 50.1163%;&quot; data-end=&quot;968&quot; data-start=&quot;963&quot; data-col-size=&quot;sm&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;984&quot; data-start=&quot;969&quot;&gt;
&lt;td style=&quot;width: 49.7674%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;979&quot; data-start=&quot;969&quot;&gt;SMTP 인증&lt;/td&gt;
&lt;td style=&quot;width: 50.1163%;&quot; data-end=&quot;984&quot; data-start=&quot;979&quot; data-col-size=&quot;sm&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1004&quot; data-start=&quot;985&quot;&gt;
&lt;td style=&quot;width: 49.7674%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;999&quot; data-start=&quot;985&quot;&gt;UTF-8 한글 처리&lt;/td&gt;
&lt;td style=&quot;width: 50.1163%;&quot; data-end=&quot;1004&quot; data-start=&quot;999&quot; data-col-size=&quot;sm&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1021&quot; data-start=&quot;1005&quot;&gt;
&lt;td style=&quot;width: 49.7674%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1016&quot; data-start=&quot;1005&quot;&gt;대량 메일 발송&lt;/td&gt;
&lt;td style=&quot;width: 50.1163%;&quot; data-end=&quot;1021&quot; data-start=&quot;1016&quot; data-col-size=&quot;sm&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1038&quot; data-start=&quot;1022&quot;&gt;
&lt;td style=&quot;width: 49.7674%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1033&quot; data-start=&quot;1022&quot;&gt;오류 로그 확인&lt;/td&gt;
&lt;td style=&quot;width: 50.1163%;&quot; data-end=&quot;1038&quot; data-start=&quot;1033&quot; data-col-size=&quot;sm&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h1 data-end=&quot;1278&quot; data-start=&quot;1255&quot; data-section-id=&quot;1c89ysj&quot;&gt;Postfix와 PHPMailer 차이&lt;/h1&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 77px;&quot; border=&quot;1&quot; data-end=&quot;1356&quot; data-start=&quot;1280&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;1324&quot; data-start=&quot;1302&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1312&quot; data-start=&quot;1302&quot;&gt;Postfix&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;1324&quot; data-start=&quot;1312&quot; data-col-size=&quot;sm&quot;&gt;실제 메일 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-end=&quot;1356&quot; data-start=&quot;1325&quot;&gt;
&lt;td style=&quot;height: 20px;&quot; data-col-size=&quot;sm&quot; data-end=&quot;1337&quot; data-start=&quot;1325&quot;&gt;PHPMailer&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot; data-end=&quot;1356&quot; data-start=&quot;1337&quot; data-col-size=&quot;sm&quot;&gt;PHP 메일 발송 라이브러리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;2. 테스트 환경&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;969&quot; data-start=&quot;828&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;877&quot; data-start=&quot;850&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;855&quot; data-start=&quot;850&quot;&gt;OS&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;877&quot; data-start=&quot;855&quot;&gt;Ubuntu 24.04.2 LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;895&quot; data-start=&quot;878&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;884&quot; data-start=&quot;878&quot;&gt;PHP&lt;/td&gt;
&lt;td data-end=&quot;895&quot; data-start=&quot;884&quot; data-col-size=&quot;sm&quot;&gt;PHP 8.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;915&quot; data-start=&quot;896&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;904&quot; data-start=&quot;896&quot;&gt;메일 발송&lt;/td&gt;
&lt;td data-end=&quot;915&quot; data-start=&quot;904&quot; data-col-size=&quot;sm&quot;&gt;Postfix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;940&quot; data-start=&quot;916&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;927&quot; data-start=&quot;916&quot;&gt;메일 라이브러리&lt;/td&gt;
&lt;td data-end=&quot;940&quot; data-start=&quot;927&quot; data-col-size=&quot;sm&quot;&gt;PHPMailer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;969&quot; data-start=&quot;941&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;949&quot; data-start=&quot;941&quot;&gt;작업 경로&lt;/td&gt;
&lt;td data-end=&quot;969&quot; data-start=&quot;949&quot; data-col-size=&quot;sm&quot;&gt;/root/mailtest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;2.1 작업&amp;nbsp;디렉토리&amp;nbsp;생성&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779108498106&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir -p /root/mailtest
cd /root/mailtest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;2.2 필수 패키지 설치&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779108550586&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt install php-mbstring
#mbstring 확장이 없으면 한글 메일 처리 시 문제가 발생할 수 있다.

apt install postfix&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QqCWf/dJMcabK4qW3/4gJjZUghPcdWyiEmBCB580/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QqCWf/dJMcabK4qW3/4gJjZUghPcdWyiEmBCB580/img.png&quot; data-alt=&quot;Internet Site 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QqCWf/dJMcabK4qW3/4gJjZUghPcdWyiEmBCB580/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQqCWf%2FdJMcabK4qW3%2F4gJjZUghPcdWyiEmBCB580%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;522&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Internet Site 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1779108612338&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#System mail name:
#발송할 메일 주소를 입력하나 여기선 auto 로 설정하고 넘김&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzRutK/dJMcacDbMnA/dqBL0TKxSZIqfQXI8Dd8lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzRutK/dJMcacDbMnA/dqBL0TKxSZIqfQXI8Dd8lk/img.png&quot; data-alt=&quot;발송할 메일 주소를 입력해야하지만 여기선 auto 로 설정하여 사용함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzRutK/dJMcacDbMnA/dqBL0TKxSZIqfQXI8Dd8lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzRutK%2FdJMcacDbMnA%2FdqBL0TKxSZIqfQXI8Dd8lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1866&quot; height=&quot;282&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;발송할 메일 주소를 입력해야하지만 여기선 auto 로 설정하여 사용함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;i&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.3 Postfix&amp;nbsp;서비스&amp;nbsp;확인&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779108744144&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl restart postfix
systemctl enable postfix
systemctl status postfix&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; 2.4&lt;/i&gt; &lt;i&gt;PHPMailer 최소 파일만 다운로드&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;s&gt;&lt;i&gt;* 전체 Git 저장소를 받을 필요 없이 필요한 파일만 받아도 동작한다.&lt;br /&gt;&lt;/i&gt;&lt;/s&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779108806860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /root/mailtest

mkdir -p PHPMailer/src

wget -O PHPMailer/src/PHPMailer.php \
https://raw.githubusercontent.com/PHPMailer/PHPMailer/master/src/PHPMailer.php

wget -O PHPMailer/src/SMTP.php \
https://raw.githubusercontent.com/PHPMailer/PHPMailer/master/src/SMTP.php

wget -O PHPMailer/src/Exception.php \
https://raw.githubusercontent.com/PHPMailer/PHPMailer/master/src/Exception.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2092&quot; data-start=&quot;2067&quot; data-ke-size=&quot;size16&quot;&gt;다운로드 후 아래 3개 파일이 존재하면 된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1779108840388&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -al PHPMailer/src

#Exception.php
#PHPMailer.php
#SMTP.php&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnjH8U/dJMcaaSTqLU/KIKMk5LdSp0d5D6IiqgCs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnjH8U/dJMcaaSTqLU/KIKMk5LdSp0d5D6IiqgCs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnjH8U/dJMcaaSTqLU/KIKMk5LdSp0d5D6IiqgCs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnjH8U%2FdJMcaaSTqLU%2FKIKMk5LdSp0d5D6IiqgCs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;126&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;3. 사용&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;color: #006dd7;&quot;&gt;3.1 수신 메일 목록 파일 생성&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779108987110&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;gt; maillist.txt &amp;lt;&amp;lt; EOF
user1@example.com
user2@example.com
user3@example.com
EOF

# 위 내용은 테스트용이며 사용시에는 실제 메일을 기입&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 3.2 메일&amp;nbsp;발송&amp;nbsp;PHP&amp;nbsp;코드&amp;nbsp;작성&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779109138865&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require __DIR__ . '/PHPMailer/src/Exception.php';
require __DIR__ . '/PHPMailer/src/PHPMailer.php';
require __DIR__ . '/PHPMailer/src/SMTP.php';

date_default_timezone_set(&quot;Asia/Seoul&quot;);

/*
|--------------------------------------------------------------------------
| SMTP 설정
|--------------------------------------------------------------------------
*/

$smtpHost = &quot;mail.example.com&quot;; -&amp;gt; 사용 중인 메일서버
$smtpPort = 465; -&amp;gt; 포트
$smtpUser = &quot;notice@example.com&quot;; -&amp;gt; 사용자 계정
$smtpPass = &quot;비밀번호&quot;; -&amp;gt; 사용자 계정에 대한 비밀번호

/*
|--------------------------------------------------------------------------
| 발송 정보
|--------------------------------------------------------------------------
*/

$fromEmail = &quot;notice@example.com&quot;; -&amp;gt; 발송 주소
$fromName  = &quot;이름&quot;; -&amp;gt; 발송인
$subject   = &quot;제목&quot;;

/*
|--------------------------------------------------------------------------
| 수신 목록
|--------------------------------------------------------------------------
*/

$mailListFile = __DIR__ . &quot;/maillist.txt&quot;;
if (!file_exists($mailListFile)) {
    exit(&quot;maillist.txt 파일이 존재하지 않습니다.\n&quot;);
}
$recipients = file(
    $mailListFile,
    FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES
);
if (!$recipients || count($recipients) === 0) {
    exit(&quot;메일 주소가 없습니다.\n&quot;);
}

/*
|--------------------------------------------------------------------------
| 중복 실행 방지
|--------------------------------------------------------------------------
*/

$lockFile = __DIR__ . &quot;/send_ssl_notice.lock&quot;;
$lockHandle = fopen($lockFile, &quot;c&quot;);
if (!$lockHandle) {
    exit(&quot;잠금 파일 생성 실패\n&quot;);
}
if (!flock($lockHandle, LOCK_EX | LOCK_NB)) {
    exit(&quot;이미 실행 중입니다.\n&quot;);


/*
|--------------------------------------------------------------------------
| 발송 완료 기록
|--------------------------------------------------------------------------
*/

$sentFile = __DIR__ . &quot;/send_ssl_notice_sent.json&quot;;
$sentList = [];
if (file_exists($sentFile)) {
    $json = file_get_contents($sentFile);
    $sentList = json_decode($json, true);
    if (!is_array($sentList)) {
        $sentList = [];
    }


/*
|--------------------------------------------------------------------------
| 메일 본문
|--------------------------------------------------------------------------
*/

$body = '
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body style=&quot;
    font-family: Malgun Gothic, Apple SD Gothic Neo, sans-serif;
    font-size:14px;
    color:#111;
    line-height:1.8;
&quot;&amp;gt;
본문 작성
';


/*
|--------------------------------------------------------------------------
| 중복 제거
|--------------------------------------------------------------------------
*/

$recipients = array_unique($recipients);

/*
|--------------------------------------------------------------------------
| 개별 발송
|--------------------------------------------------------------------------
*/

foreach ($recipients as $to) {
    $to = trim($to);
    if (empty($to)) {
        continue;
    }
    if (!filter_var($to, FILTER_VALIDATE_EMAIL)) {
        echo &quot;[SKIP] 잘못된 이메일 주소: {$to}\n&quot;;
        continue;
    }
    if (isset($sentList[$to])) {
        echo &quot;[SKIP] 이미 발송 완료: {$to}\n&quot;;
        continue;
    }
    try {
        $mail = new PHPMailer(true);
        /*
        |--------------------------------------------------------------------------
        | SMTP 설정
        |--------------------------------------------------------------------------
        */
        $mail-&amp;gt;isSMTP();
        $mail-&amp;gt;Host       = $smtpHost;
        $mail-&amp;gt;SMTPAuth   = true;
        $mail-&amp;gt;Username   = $smtpUser;
        $mail-&amp;gt;Password   = $smtpPass;
        $mail-&amp;gt;SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
        $mail-&amp;gt;Port       = $smtpPort;
        /*
        |--------------------------------------------------------------------------
        | 메일 설정
        |--------------------------------------------------------------------------
        */
        $mail-&amp;gt;CharSet = &quot;UTF-8&quot;;
        $mail-&amp;gt;setFrom($fromEmail, $fromName);
        $mail-&amp;gt;addAddress($to);
        // 참조 추가
        $mail-&amp;gt;addCC(&quot;참조 받을 주소&quot;);
        $mail-&amp;gt;Subject = $subject;
        $mail-&amp;gt;isHTML(true);
        $mail-&amp;gt;Body = $body;
        $mail-&amp;gt;AltBody = &quot;안내 메일입니다.&quot;;
        /*
        |--------------------------------------------------------------------------
        | 발송
        |--------------------------------------------------------------------------
        */
        $mail-&amp;gt;send();
        /*
        |--------------------------------------------------------------------------
        | 발송 완료 기록
        |--------------------------------------------------------------------------
        */
        $sentList[$to] = [
            &quot;sent_at&quot; =&amp;gt; date(&quot;Y-m-d H:i:s&quot;),
            &quot;subject&quot; =&amp;gt; $subject
        ];
        file_put_contents(
            $sentFile,
            json_encode(
                $sentList,
                JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
            ),
            LOCK_EX
        );
        echo &quot;[OK] 발송 완료: {$to}\n&quot;;
    } catch (Exception $e) {
        echo &quot;[FAIL] {$to}\n&quot;;
        echo $mail-&amp;gt;ErrorInfo . &quot;\n&quot;;
    }


    /*
    |--------------------------------------------------------------------------
    | 스팸 판정 완화
    |--------------------------------------------------------------------------
    */

    sleep(2);
}

/*
|--------------------------------------------------------------------------
| 잠금 해제
|--------------------------------------------------------------------------
*/

flock($lockHandle, LOCK_UN);

fclose($lockHandle);

echo &quot;전체 작업 완료\n&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3.3 실행&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779109276860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;php send_ssl_notice.php&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJsbkx/dJMcaja63g3/QZkD8iKzdc8NFV6oNpCgcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJsbkx/dJMcaja63g3/QZkD8iKzdc8NFV6oNpCgcK/img.png&quot; data-alt=&quot;실행 후 디렉토리에 생성된 파일들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJsbkx/dJMcaja63g3/QZkD8iKzdc8NFV6oNpCgcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJsbkx%2FdJMcaja63g3%2FQZkD8iKzdc8NFV6oNpCgcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;907&quot; height=&quot;109&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 후 디렉토리에 생성된 파일들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 발송 된 메일을 확인한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;4. 주의 사항&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;4.1&amp;nbsp;너무&amp;nbsp;빠른&amp;nbsp;발송은&amp;nbsp;스팸&amp;nbsp;판정을&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있음&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779110028999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sleep(2);

#위와 같이 발송 간 딜레이를 주는 것을 권장한다.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; 4.2 이미 발송한 주소는 재발송되지 않음&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1779110088705&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#sent.json 파일 기준으로 이미 발송된 주소는 자동 제외된다.

#동일 주소로 다시 발송하려면:

rm -f sent.json

#이후 다시 실행하면 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt; 4.3 참조(CC)&amp;nbsp;제거&amp;nbsp;방법&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779110143022&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#아래 코드가 있는 경우:

$mail-&amp;gt;addCC(&quot;admin@example.com&quot;);

#사용하지 않으려면 앞에 // 처리하면 된다.

// $mail-&amp;gt;addCC(&quot;admin@example.com&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; 5. 마무리&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Postfix와 PHPMailer를 조합하면 Ubuntu&amp;nbsp;서버에서도&amp;nbsp;비교적&amp;nbsp;간단하게&amp;nbsp;다수&amp;nbsp;사용자&amp;nbsp;대상&amp;nbsp;메일&amp;nbsp;발송&amp;nbsp;환경을&amp;nbsp;구축할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;운영&amp;nbsp;환경에서는&amp;nbsp;아래&amp;nbsp;기능들이&amp;nbsp;매우&amp;nbsp;중요하다.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;- 중복 발송 방지&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;- SMTP 인증&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;- HTML 메일 지원&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;- 발송 기록 저장&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;- 스팸 완화 딜레이&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;단순&amp;nbsp;테스트&amp;nbsp;수준이&amp;nbsp;아니라&amp;nbsp;실제&amp;nbsp;운영에서도&amp;nbsp;충분히&amp;nbsp;활용&amp;nbsp;가능한&amp;nbsp;방식이며,&lt;br /&gt;안내 메일, 점검 공지, 서비스 정책 안내 등 다양한 용도로 응용 가능하다.&lt;/p&gt;</description>
      <category>리눅스</category>
      <category>linux서버</category>
      <category>phpmailer</category>
      <category>PHP메일발송</category>
      <category>postfix</category>
      <category>SMTP설정</category>
      <category>ubuntu</category>
      <category>대량메일발송</category>
      <category>메일발송자동화</category>
      <category>시스템관리</category>
      <category>웹메일</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/42</guid>
      <comments>https://https443.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 18 May 2026 23:23:48 +0900</pubDate>
    </item>
    <item>
      <title>Linux 서비스 자동실행(enable) 설정 방법 정리</title>
      <link>https://https443.tistory.com/41</link>
      <description>&lt;p data-end=&quot;167&quot; data-start=&quot;99&quot; data-ke-size=&quot;size16&quot;&gt;리눅스 서버를 운영하다 보면 &lt;b&gt;서비스(Service)&lt;/b&gt;를 재부팅 후에도 자동으로 실행되도록 설정해야 하는 경우가 많습니다.&lt;/p&gt;
&lt;p data-end=&quot;210&quot; data-start=&quot;169&quot; data-ke-size=&quot;size16&quot;&gt;하지만 사용하는 OS 버전에 따라 설정 방식과 명령어가 서로 다릅니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-end=&quot;215&quot; data-start=&quot;212&quot; data-ke-size=&quot;size16&quot;&gt;예를 들&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;278&quot; data-start=&quot;217&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;244&quot; data-start=&quot;217&quot; data-section-id=&quot;1bi138j&quot;&gt;&lt;b&gt;CentOS 5/6 &amp;rarr; SysVinit&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;278&quot; data-start=&quot;245&quot; data-section-id=&quot;1yk2bla&quot;&gt;&lt;b&gt;CentOS 7 / Ubuntu &amp;rarr; systemd&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;325&quot; data-start=&quot;280&quot; data-ke-size=&quot;size16&quot;&gt;기반으로 나뉘기 때문에 명령어 차이를 알고 있어야 운영 시 혼동이 줄어듭니다.&lt;br /&gt;해당 글에선 OS 별로 설정 방법에 대해 서술합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;1. Linux 서비스 자동실행(enable) 설정 방법 정리&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;93&quot; data-start=&quot;67&quot; data-ke-size=&quot;size16&quot;&gt;(CentOS 5/6/7 + Ubuntu 비교)&lt;/p&gt;
&lt;p data-end=&quot;165&quot; data-start=&quot;95&quot; data-ke-size=&quot;size16&quot;&gt;리눅스에서 서비스(Service)를 부팅 시 자동 실행되도록 설정하는 방법은 OS 버전에 따라 사용하는 명령어가 다릅니다.&lt;/p&gt;
&lt;p data-end=&quot;165&quot; data-start=&quot;95&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;OS 버전&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;관리 시스템&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;사용 명령어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;CentOS 5/6&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;SysVinit&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;chkconfig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;CentOS 7&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;systemd&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;systemctl enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;Ubuntu (16.04 이상)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;systemd&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;systemctl enable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;2. 예시&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778829241998&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;centos7, apache 예시

#자동실행 설정
systemctl enable httpd

#자동실행 해제
systemctl disable httpd

#현재 자동 실행 여부 확인
systemctl is-enabled httpd
systemctl list-unit-files --type=service | grep httpd

# 전체 서비스 확인
systemctl list-unit-files --type=service

# 서비스 상태 확인
systemctl status httpd&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1778829340926&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#CentOS 5 / CentOS 6 (chkconfig 방식)
#CentOS 5, 6은 SysVinit 기반이며 chkconfig 명령어를 사용합니다.

#  자동 실행 설정
chkconfig httpd on

#  자동 실행 해제
chkconfig httpd off

#  자동 실행 여부 확인
chkconfig --list httpd

#출력 예:
httpd  0:off 1:off 2:on 3:on 4:on 5:on 6:off
#3, 5 레벨이 on이면 일반 부팅 시 자동 실행됩니다.


#  서비스 실행/중지
service httpd start
service httpd stop
service httpd restart&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1778829457327&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Ubuntu (systemd 방식)

#Ubuntu 16.04 이상은 systemd 기반이므로 CentOS 7과 동일하게 systemctl을 사용합니다.

  자동 실행 설정
systemctl enable apache2

#Ubuntu는 패키지명이 다를 수 있습니다.

예: Apache &amp;rarr; apache2

#  자동 실행 해제
systemctl disable apache2

#  자동 실행 여부 확인
systemctl is-enabled apache2&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;3. 버전별&amp;nbsp;명령어&amp;nbsp;비교&amp;nbsp;요약&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;작업&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;CentOS&amp;nbsp;5/6&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;CentOS&amp;nbsp;7&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Ubuntu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;자동실행&amp;nbsp;설정&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;chkconfig&amp;nbsp;httpd&amp;nbsp;on&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;systemctl&amp;nbsp;enable&amp;nbsp;httpd&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;systemctl&amp;nbsp;enable&amp;nbsp;apache2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;자동실행 해제&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;chkconfig&amp;nbsp;httpd&amp;nbsp;off&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;systemctl&amp;nbsp;disable&amp;nbsp;httpd&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;systemctl&amp;nbsp;disable&amp;nbsp;apache2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;상태 확인&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;chkconfig&amp;nbsp;--list&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;systemctl&amp;nbsp;is-enabled&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;systemctl&amp;nbsp;is-enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;서비스 실행&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;service&amp;nbsp;httpd&amp;nbsp;start&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;systemctl&amp;nbsp;start&amp;nbsp;httpd&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;systemctl&amp;nbsp;start&amp;nbsp;apache2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;4. 마무리&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3045&quot; data-start=&quot;3007&quot; data-ke-size=&quot;size16&quot;&gt;Linux 서버는 OS 버전에 따라 서비스 관리 방식이 다릅니다.&lt;/p&gt;
&lt;p data-end=&quot;3050&quot; data-start=&quot;3047&quot; data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3110&quot; data-start=&quot;3052&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3080&quot; data-start=&quot;3052&quot; data-section-id=&quot;1matrbw&quot;&gt;&lt;b&gt;CentOS 5/6 &amp;rarr; chkconfig&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3110&quot; data-start=&quot;3081&quot; data-section-id=&quot;1694h1i&quot;&gt;&lt;b&gt;CentOS 7 이상 &amp;rarr; systemctl&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3148&quot; data-start=&quot;3112&quot; data-ke-size=&quot;size16&quot;&gt;차이를 알고 있으면 운영 중 명령어 혼동을 줄일 수 있습니다. &lt;br /&gt;실무에서는 Apache(httpd), MySQL(MariaDB), Redis 등의 자동 실행 설정 시 자주 사용하는 명령어입니다.&lt;/p&gt;</description>
      <category>리눅스</category>
      <category>centos7</category>
      <category>chkconfig</category>
      <category>linux</category>
      <category>linux명령어</category>
      <category>systemctl</category>
      <category>systemd</category>
      <category>ubuntu</category>
      <category>리눅스서버</category>
      <category>서버운영</category>
      <category>웹호스팅</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/41</guid>
      <comments>https://https443.tistory.com/41#entry41comment</comments>
      <pubDate>Sun, 17 May 2026 21:23:37 +0900</pubDate>
    </item>
    <item>
      <title>CentOS7 Remi Repository(remi.repo) 설정</title>
      <link>https://https443.tistory.com/40</link>
      <description>&lt;p data-end=&quot;141&quot; data-start=&quot;60&quot; data-ke-size=&quot;size16&quot;&gt;CentOS 7 서버를 운영하다 보면 기본 저장소(Base Repository)에서 제공하는 PHP 버전이 너무 낮아 난감한 경우가 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;252&quot; data-start=&quot;143&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;특히 오래된 CentOS 7 환경에서는 기본 PHP 버전이 5.4로 제공되는 경우가 많아 &lt;br /&gt;최근 웹 솔루션이나 워드프레스, 그누보드, 각종 PHP 패키지 설치 시 호환 문제가 발생하기도 합니다.&lt;/p&gt;
&lt;p data-end=&quot;310&quot; data-start=&quot;254&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이럴 때 많이 사용하는 저장소가 바로 &lt;b&gt;Remi Repository(Remi Repo)&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-end=&quot;337&quot; data-start=&quot;312&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이번 글에서는 실제 서버 운영 환경 기준으로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;411&quot; data-start=&quot;339&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;339&quot; data-section-id=&quot;1shjkfq&quot;&gt;remi.repo가 무엇인지&lt;/li&gt;
&lt;li data-end=&quot;380&quot; data-start=&quot;357&quot; data-section-id=&quot;1ezzal5&quot;&gt;Remi Repository 설치 방법&lt;/li&gt;
&lt;li data-end=&quot;397&quot; data-start=&quot;381&quot; data-section-id=&quot;109gv54&quot;&gt;PHP 7.4 활성화 방법&lt;/li&gt;
&lt;li data-end=&quot;411&quot; data-start=&quot;398&quot; data-section-id=&quot;b99268&quot;&gt;저장소 비활성화 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;425&quot; data-start=&quot;413&quot; data-ke-size=&quot;size16&quot;&gt;까지 정리해보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;1. remi.repo란? &lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;492&quot; data-start=&quot;447&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;remi.repo&lt;/b&gt; 는 Remi Repository 저장소 설정 파일입니다. 보통 아래 경로에 생성됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1778827361427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/etc/yum.repos.d/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;602&quot; data-start=&quot;569&quot; data-ke-size=&quot;size16&quot;&gt;기본 OS 저장소보다 더 최신 버전의:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;635&quot; data-start=&quot;604&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;609&quot; data-start=&quot;604&quot; data-section-id=&quot;1o4ogw&quot;&gt;PHP&lt;/li&gt;
&lt;li data-end=&quot;617&quot; data-start=&quot;610&quot; data-section-id=&quot;16wc4lu&quot;&gt;MySQL&lt;/li&gt;
&lt;li data-end=&quot;627&quot; data-start=&quot;618&quot; data-section-id=&quot;x9szg8&quot;&gt;MariaDB&lt;/li&gt;
&lt;li data-end=&quot;635&quot; data-start=&quot;628&quot; data-section-id=&quot;179h5y9&quot;&gt;Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;655&quot; data-start=&quot;637&quot; data-ke-size=&quot;size16&quot;&gt;등을 제공하는 외부 저장소입니다.&lt;/p&gt;
&lt;p data-end=&quot;663&quot; data-start=&quot;657&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;732&quot; data-start=&quot;665&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;688&quot; data-start=&quot;665&quot; data-section-id=&quot;9qo9r6&quot;&gt;기본 CentOS 7 &amp;rarr; PHP 5.4&lt;/li&gt;
&lt;li data-end=&quot;732&quot; data-start=&quot;689&quot; data-section-id=&quot;k7gsxm&quot;&gt;Remi 사용 &amp;rarr; PHP 7.4 / 8.0 / 8.1 / 8.2 설치 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;791&quot; data-start=&quot;734&quot; data-ke-size=&quot;size16&quot;&gt;실제 서버 운영에서는 PHP 버전 업그레이드를 위해 거의 필수적으로 사용되는 저장소 중 하나입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WENrj/dJMcaicjnhr/FCdWTa8a3Xeq9Q8tZxkfRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WENrj/dJMcaicjnhr/FCdWTa8a3Xeq9Q8tZxkfRk/img.png&quot; data-alt=&quot;CentOS7 기준 Base.repo 사용, php 설치시 기본으로 설치되는 버전은 5.4 버전, 설치 후 사용할 버전은 7.4라는 가정하에 진행 했습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WENrj/dJMcaicjnhr/FCdWTa8a3Xeq9Q8tZxkfRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWENrj%2FdJMcaicjnhr%2FFCdWTa8a3Xeq9Q8tZxkfRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;936&quot; height=&quot;225&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CentOS7 기준 Base.repo 사용, php 설치시 기본으로 설치되는 버전은 5.4 버전, 설치 후 사용할 버전은 7.4라는 가정하에 진행 했습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;2. 설치&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778827640290&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#1. 먼저 yum-utils 패키지가 설치되어 있는지 확인합니다.

rpm -qa | grep yum-utils

#2. 만약 결과가 없다면 아래 명령어로 설치합니다.

yum install -y yum-utils

#yum-utils 는 
#YUM 패키지 관리자를 보다 편하게 사용할 수 있도록 도와주는 보조 도구 모음 패키지입니다.
#즉, 기본 yum 기능을 확장해주는 유틸리티 패키지라고 생각하면 됩니다.

#3. 아래 명령어를 사용하여 Remi 저장소를 설치합니다.

yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

#설치 후 /etc/yum.repos.d 디렉토리를 확인하면 관련 repo 파일들이 생성된 것을 확인할 수 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PTnFQ/dJMcabjXpnQ/C4gRO7W3Sg86vMpvkzHk70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PTnFQ/dJMcabjXpnQ/C4gRO7W3Sg86vMpvkzHk70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PTnFQ/dJMcabjXpnQ/C4gRO7W3Sg86vMpvkzHk70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPTnFQ%2FdJMcabjXpnQ%2FC4gRO7W3Sg86vMpvkzHk70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;908&quot; height=&quot;224&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;3. Remi 저장소 활성화&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;* 이번 예시에서는 PHP 7.4 사용이 목적이므로 remi-php74 저장소를 활성화합니다.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778827740410&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 저장소 활성화
yum-config-manager --enable remi-php74

# 활성화 확인
yum repolist enabled | grep remi&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTKLJ/dJMcadWi0Zx/r5dMxxK65JnbhelI42WpD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTKLJ/dJMcadWi0Zx/r5dMxxK65JnbhelI42WpD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTKLJ/dJMcadWi0Zx/r5dMxxK65JnbhelI42WpD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTKLJ%2FdJMcadWi0Zx%2Fr5dMxxK65JnbhelI42WpD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;914&quot; height=&quot;90&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;4. 패키지 설치 가능 여부 확인 및 버전 확인&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;#Remi&amp;nbsp;저장소&amp;nbsp;활성화&amp;nbsp;전에는&amp;nbsp;No&amp;nbsp;package&amp;nbsp;available&amp;nbsp;처럼&amp;nbsp;출력되던&amp;nbsp;패키지들이활성화&amp;nbsp;이후에는&amp;nbsp;정상적으로&amp;nbsp;조회됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후&lt;/p&gt;
&lt;pre id=&quot;code_1778827901891&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#php 버전확인
php -v

#설치된 PHP 패키지 확인
rpm -qa | grep php | sort

#을 통해 확인 가능합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;5. repo&amp;nbsp;파일&amp;nbsp;직접&amp;nbsp;수정하는&amp;nbsp;방법&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778828008699&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Remi 저장소 비활성화 방법
yum-config-manager --disable remi-php74


#직접 repo 파일을 수정하는 방법도 있습니다.

vi /etc/yum.repos.d/remi-php74.repo

#이후 아래 항목을

enabled=1 (활성화)

enabled=0 (비활성화)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;span&gt;6.실제&amp;nbsp;운영&amp;nbsp;시&amp;nbsp;참고할&amp;nbsp;부분&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2658&quot; data-start=&quot;2613&quot; data-ke-size=&quot;size16&quot;&gt;Remi 저장소는 매우 편리하지만 운영 서버에서는 몇 가지 주의가 필요합니다.&lt;/p&gt;
&lt;p data-end=&quot;2663&quot; data-start=&quot;2660&quot; data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2741&quot; data-start=&quot;2665&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2689&quot; data-start=&quot;2665&quot; data-section-id=&quot;1fgrgd0&quot;&gt;PHP 버전 변경 시 기존 사이트 호환성&lt;/li&gt;
&lt;li data-end=&quot;2705&quot; data-start=&quot;2690&quot; data-section-id=&quot;zb1xmg&quot;&gt;ionCube 사용 여부&lt;/li&gt;
&lt;li data-end=&quot;2724&quot; data-start=&quot;2706&quot; data-section-id=&quot;1nv8bp0&quot;&gt;Apache/PHP 모듈 충돌&lt;/li&gt;
&lt;li data-end=&quot;2741&quot; data-start=&quot;2725&quot; data-section-id=&quot;4k6z8l&quot;&gt;MariaDB 버전 의존성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2762&quot; data-start=&quot;2743&quot; data-ke-size=&quot;size16&quot;&gt;등을 반드시 함께 확인해야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;2811&quot; data-start=&quot;2764&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;실제 서비스 서버에서는 테스트 서버에서 먼저 검증 후 적용하는 방식이 안전합니다.&lt;/p&gt;</description>
      <category>etc</category>
      <category>centos7</category>
      <category>linux명령어</category>
      <category>PHP74</category>
      <category>php설치</category>
      <category>RemiRepository</category>
      <category>yum설정</category>
      <category>리눅스서버</category>
      <category>서버관리</category>
      <category>서버운영</category>
      <category>웹호스팅</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/40</guid>
      <comments>https://https443.tistory.com/40#entry40comment</comments>
      <pubDate>Sat, 16 May 2026 12:10:01 +0900</pubDate>
    </item>
    <item>
      <title>구글 검색 결과에 표시되는 파비콘(Favicon) 변경 방법 정리</title>
      <link>https://https443.tistory.com/39</link>
      <description>&lt;p data-end=&quot;104&quot; data-start=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;웹사이트를 운영하다 보면&lt;br /&gt;구글 검색 결과나 브라우저 탭에 표시되는 작은 아이콘을 변경하고 싶은 경우가 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;189&quot; data-start=&quot;106&quot; data-ke-size=&quot;size16&quot;&gt;특히 최근에는 검색 결과에서도 브랜드 아이콘이 함께 노출되기 때문에,&lt;br /&gt;파비콘(Favicon) 설정은 단순 꾸미기 이상의 의미를 가지게 되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;267&quot; data-start=&quot;191&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 실제 서버 운영 환경 기준으로 파비콘 생성부터 적용, Google Search Console 반영까지 정리해보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;1. 파비콘(Favicon)이란?&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;340&quot; data-start=&quot;294&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Favicon(파비콘)&lt;/b&gt;은 웹사이트를 대표하는 작은 아이콘 이미지입니다. 보통 아래 위치에서 확인할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;444&quot; data-start=&quot;366&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;379&quot; data-start=&quot;366&quot; data-section-id=&quot;1rynq7i&quot;&gt;브라우저 탭 제목 앞&lt;/li&gt;
&lt;li data-end=&quot;391&quot; data-start=&quot;380&quot; data-section-id=&quot;1mm1wey&quot;&gt;즐겨찾기(북마크)&lt;/li&gt;
&lt;li data-end=&quot;406&quot; data-start=&quot;392&quot; data-section-id=&quot;1ffdqyw&quot;&gt;모바일 홈 화면 아이콘&lt;/li&gt;
&lt;li data-end=&quot;430&quot; data-start=&quot;407&quot; data-section-id=&quot;wmfrzo&quot;&gt;Google 검색 결과의 사이트 아이콘&lt;/li&gt;
&lt;li data-end=&quot;444&quot; data-start=&quot;431&quot; data-section-id=&quot;1t1kodd&quot;&gt;모바일 브라우저 상단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;494&quot; data-start=&quot;446&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 Google 검색 시 도메인 왼쪽에 보이는 작은 이미지가 바로 파비콘입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oK9jb/dJMcagrY9i3/kW1IwGgICxZkSbSJjZpEr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oK9jb/dJMcagrY9i3/kW1IwGgICxZkSbSJjZpEr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oK9jb/dJMcagrY9i3/kW1IwGgICxZkSbSJjZpEr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoK9jb%2FdJMcagrY9i3%2FkW1IwGgICxZkSbSJjZpEr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;156&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;2. 파비콘&amp;nbsp;파일&amp;nbsp;형식과&amp;nbsp;권장&amp;nbsp;크기&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;546&quot; data-start=&quot;522&quot; data-ke-size=&quot;size16&quot;&gt;가장 많이 사용하는 형식은 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;579&quot; data-start=&quot;548&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;563&quot; data-start=&quot;548&quot; data-section-id=&quot;1u2ptvd&quot;&gt;favicon.ico&lt;/li&gt;
&lt;li data-end=&quot;571&quot; data-start=&quot;564&quot; data-section-id=&quot;1691ilt&quot;&gt;png&lt;/li&gt;
&lt;li data-end=&quot;579&quot; data-start=&quot;572&quot; data-section-id=&quot;16951hm&quot;&gt;svg&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;638&quot; data-start=&quot;581&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로는 favicon.ico 를 가장 많이 사용하며, 브라우저 호환성도 가장 안정적입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;649&quot; data-start=&quot;640&quot; data-section-id=&quot;1hwiypf&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;i&gt;&lt;b&gt;* 권장 크기&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;761&quot; data-start=&quot;651&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 49.3023%;&quot;&gt;용도&lt;/td&gt;
&lt;td style=&quot;width: 50.5815%;&quot;&gt;권장 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;697&quot; data-start=&quot;676&quot;&gt;
&lt;td style=&quot;width: 49.3023%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;688&quot; data-start=&quot;676&quot;&gt;기본 브라우저 탭&lt;/td&gt;
&lt;td style=&quot;width: 50.5815%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;697&quot; data-start=&quot;688&quot;&gt;16x16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;719&quot; data-start=&quot;698&quot;&gt;
&lt;td style=&quot;width: 49.3023%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;710&quot; data-start=&quot;698&quot;&gt;일반 웹 브라우저&lt;/td&gt;
&lt;td style=&quot;width: 50.5815%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;719&quot; data-start=&quot;710&quot;&gt;32x32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;739&quot; data-start=&quot;720&quot;&gt;
&lt;td style=&quot;width: 49.3023%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;730&quot; data-start=&quot;720&quot;&gt;고해상도 환경&lt;/td&gt;
&lt;td style=&quot;width: 50.5815%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;739&quot; data-start=&quot;730&quot;&gt;48x48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;761&quot; data-start=&quot;740&quot;&gt;
&lt;td style=&quot;width: 49.3023%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;750&quot; data-start=&quot;740&quot;&gt;모바일 아이콘&lt;/td&gt;
&lt;td style=&quot;width: 50.5815%;&quot; data-col-size=&quot;sm&quot; data-end=&quot;761&quot; data-start=&quot;750&quot;&gt;180x180&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;s&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp;* 이번 게시글에 적용 된 내용은 favicon.ico, favicon-48x48.png 을 사용하였습니다.&lt;/b&gt;&lt;/i&gt;&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;3. 파비콘 생성 방법&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778824818733&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#3.1 이미지 생성
#이번 작업에서는 아래 사이트를 사용했습니다.

https://favicon.io/favicon-converter/

#이미지 파일을 업로드하면
#브라우저 호환 형태로 자동 변환해주기 때문에 편리합니다.

#보통 로고 PNG 파일 하나만 준비하면 충분합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1778824941891&quot; class=&quot;vala&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;#3.2 브라우저는 favicon.ico 를 자동 탐색한다.

#많은 경우 별도 설정을 하지 않아도 브라우저가 아래 경로를 자동 확인합니다.

https://도메인/favicon.ico


#파비콘 설정을 안 했는데 아이콘이 보인다, 이전 아이콘이 계속 나온다
#이런 경우 대부분 서버 루트에 기존 favicon.ico 파일이 남아있는 경우가 많습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1778824987472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#3.3 HTML에서 직접 파비콘 지정하기

#보다 안정적으로 적용하려면 HTML 헤더에서 직접 지정하는 것이 좋습니다.

&amp;lt;link rel=&quot;icon&quot; href=&quot;/favicon.ico&quot;&amp;gt;
&amp;lt;link rel=&quot;icon&quot; type=&quot;image/png&quot; sizes=&quot;32x32&quot; href=&quot;/favicon-48x48.png&quot;&amp;gt;
&amp;lt;link rel=&quot;apple-touch-icon&quot; href=&quot;/apple-touch-icon.png&quot;&amp;gt;

#_head.php, head.php 같은 공통 헤더 파일에 넣는 게 일반적입니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1778825199633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#3.4 Google 검색 결과에 바로 반영되지 않는 이유, Google Search Console에서 재수집 요청하기

#파일만 교체했다고 해서 Google 검색 결과가 즉시 변경되지는 않습니다.
#Google은 일정 주기로 다시 크롤링하면서 파비콘 정보를 갱신합니다.
#따라서 실제 운영에서는 아래 작업까지 같이 진행하는 편입니다.


#먼저 아래 사이트 접속 후 도메인을 등록합니다.

https://search.google.com/search-console/about?hl=ko

#인증 완료 후 URL 검사, 사이트맵 확인, 재색인 요청 순서로 진행합니다.
#robots.txt 차단 여부도 함께 확인하는 것이 좋습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1553&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coiLT2/dJMcacC9Km4/qYUzpospKJHzH0bkaavYyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coiLT2/dJMcacC9Km4/qYUzpospKJHzH0bkaavYyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coiLT2/dJMcacC9Km4/qYUzpospKJHzH0bkaavYyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoiLT2%2FdJMcacC9Km4%2FqYUzpospKJHzH0bkaavYyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1553&quot; height=&quot;670&quot; data-origin-width=&quot;1553&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;* 위 작업 진행 후 로그 확인시 아래와 같이 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnXt4F/dJMcac4aKpH/m2P84mgkwPBA0QMjKmXaL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnXt4F/dJMcac4aKpH/m2P84mgkwPBA0QMjKmXaL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnXt4F/dJMcac4aKpH/m2P84mgkwPBA0QMjKmXaL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnXt4F%2FdJMcac4aKpH%2Fm2P84mgkwPBA0QMjKmXaL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;26&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;26&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;4. 마무리 &lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.3953%;&quot;&gt;순번&lt;/td&gt;
&lt;td style=&quot;width: 78.6047%;&quot;&gt;작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.3953%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 78.6047%;&quot;&gt;favicon 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.3953%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 78.6047%;&quot;&gt;서버 업로드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.3953%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 78.6047%;&quot;&gt;HTML&amp;nbsp;헤더&amp;nbsp;적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.3953%;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 78.6047%;&quot;&gt;Search&amp;nbsp;Console&amp;nbsp;재수집&amp;nbsp;요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.3953%;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 78.6047%;&quot;&gt;캐시&amp;nbsp;확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2748&quot; data-start=&quot;2724&quot; data-ke-size=&quot;size16&quot;&gt;이 순서로 진행하면 대부분 정상 반영됩니다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2823&quot; data-start=&quot;2750&quot; data-ke-size=&quot;size16&quot;&gt;특히 Google 검색 결과는 즉시 변경되지 않기 때문에, 일정 기간 반영 시간이 걸릴 수 있다는 점도 참고하면 좋겠습니다.&lt;/p&gt;</description>
      <category>etc</category>
      <category>48x48</category>
      <category>favicon</category>
      <category>favicon.ico</category>
      <category>favicon설정</category>
      <category>seo최적화</category>
      <category>구글검색노출</category>
      <category>구글서치콘솔</category>
      <category>웹사이트운영</category>
      <category>이미지</category>
      <category>파비콘</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/39</guid>
      <comments>https://https443.tistory.com/39#entry39comment</comments>
      <pubDate>Fri, 15 May 2026 20:07:41 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 방화벽 최적화 - ipset 설정으로 대량 IP 차단하는 방법 (Ubuntu)</title>
      <link>https://https443.tistory.com/38</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://https443.tistory.com/37&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://https443.tistory.com/37&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;s&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;CentOS 환경에서 설치 및 사용 방법은 이전 글 확인&lt;/span&gt;&lt;/s&gt;&lt;/i&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;17&quot; data-end=&quot;120&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;1. 사용 방법&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;17&quot; data-end=&quot;120&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1&lt;/span&gt;.1 ipset 설치 (없는 경우) 및 확인&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;가장 먼저 시스템에 ipset이 설치되어 있는지 확인해야 합니다. &lt;br /&gt;만약 설치되어 있지 않다면 아래 명령어를 통해 패키지 목록을 갱신하고 설치를 진행해 주세요. &lt;br /&gt;iptables가 없는 환경이라면 함께 설치하는 것이 좋습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;17&quot; data-end=&quot;120&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772172096456&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 패키지 목록 갱신
apt update

# ipset 설치
apt install ipset&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zg49B/dJMcafMt7ZR/8FasHG9QJZDxxAfkiXfhe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zg49B/dJMcafMt7ZR/8FasHG9QJZDxxAfkiXfhe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zg49B/dJMcafMt7ZR/8FasHG9QJZDxxAfkiXfhe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzg49B%2FdJMcafMt7ZR%2F8FasHG9QJZDxxAfkiXfhe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;135&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1772172479765&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#iptables가 없는 경우 함께 설치
apt install iptables -y

#설치 확인
dpkg -l | grep ipset
dpkg -l | grep iptables

#모듈 확인
lsmod | grep ip_set

#로드 안 되어 있으면 수동 로드
modprobe ip_set
modprobe ip_set_hash_net
modprobe xt_set&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnwX4y/dJMcadgNTxs/1jkBFkaLBuGJiYKWnXZ2xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnwX4y/dJMcadgNTxs/1jkBFkaLBuGJiYKWnXZ2xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnwX4y/dJMcadgNTxs/1jkBFkaLBuGJiYKWnXZ2xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnwX4y%2FdJMcadgNTxs%2F1jkBFkaLBuGJiYKWnXZ2xK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;151&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; &lt;i&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 1.2 IP 대역 파일 다운로드&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;&lt;br /&gt;/etc 경로 아래에 ipset 디렉토리를 생성한 후 작업을 진행합니다. &lt;br /&gt;여기서는 예시로 브라질과 중국의 IP 대역 데이터를 다운로드하여 특정 국가의 접근을 차단해 보겠습니다.&lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772172962282&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# /etc 밑에 ipset 디렉토리 생성 후 진행 
mkdir -p /etc/ipset

# 국가별 IP 대역 다운로드 (브라질, 중국 IP 차단 예시)
# 브라질 IP
wget -qO /etc/ipset/br.zone https://www.ipdeny.com/ipblocks/data/countries/br.zone

# 중국 IP
wget -qO /etc/ipset/cn.zone https://www.ipdeny.com/ipblocks/data/countries/cn.zone&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WMWfL/dJMcagdxZzr/89wsaakDgCJ6yHwlEEN0Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WMWfL/dJMcagdxZzr/89wsaakDgCJ6yHwlEEN0Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WMWfL/dJMcagdxZzr/89wsaakDgCJ6yHwlEEN0Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWMWfL%2FdJMcagdxZzr%2F89wsaakDgCJ6yHwlEEN0Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;929&quot; height=&quot;147&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&amp;nbsp;&lt;b&gt; 1.3 ipset 세트 생성&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 데이터를 담을 관리 세트를 생성합니다. &lt;br /&gt;이미 세트가 존재할 경우 에러가 발생할 수 있으므로, 실제 운영 환경에서는 -exist 옵션을 사용하여 중복 생성을 방지하는 것이 효율적입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772173272216&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 브라질
ipset create brazil hash:net

# 중국
ipset create china hash:net

# 그 외 국가 추가 가능, 
#이미 존재할 경우 에러 발생 가능하므로 운영 환경에서는 -exist 옵션 사용 권장함

ipset create brazil hash:net -exist
ipset create china hash:net -exist&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp; 1.4 세트에 IP 대역 추가&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 다운로드한 국가별 IP 대역 파일의 내용을 읽어와서 ipset 세트에 등록합니다.&lt;br /&gt;반복문을 사용하여 파일 안의 모든 IP 주소를 하나씩 추가해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772173412663&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 브라질
for i in $(cat /etc/ipset/br.zone); do
    ipset add brazil $i
done

# 중국
for i in $(cat /etc/ipset/cn.zone); do
    ipset add china $i
done




#IP 추가 시에도 중복 방지하려면
for i in $(cat /etc/ipset/br.zone); do
    ipset add brazil $i -exist
done


for i in $(cat /etc/ipset/cn.zone); do
    ipset add china $i -exist
done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; 1.5 적용&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;생성한 ipset을 실제 방화벽 규칙에 적용하는 단계입니다.&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772173505614&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#1.5.1 iptables에서 ipset 적용
iptables를 사용하여 특정 국가의 IP 세트로부터 들어오는 접속을 차단(DROP)하도록 설정합니다.

# 브라질 차단
iptables -A INPUT -m set --match-set brazil src -j DROP

# 중국 차단
iptables -A INPUT -m set --match-set china src -j DROP&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dm1ZqJ/dJMcajgYrpf/88OQELHnxyYcbAl9qX7340/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dm1ZqJ/dJMcajgYrpf/88OQELHnxyYcbAl9qX7340/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dm1ZqJ/dJMcajgYrpf/88OQELHnxyYcbAl9qX7340/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdm1ZqJ%2FdJMcajgYrpf%2F88OQELHnxyYcbAl9qX7340%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;439&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772173875757&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#1.5.2 UFW 사용하는 경우

우분투의 기본 방화벽인 UFW를 사용 중이라면 
iptables 규칙을 직접 수정할 때 정책 충돌이 발생할 수 있습니다. 
이런 경우에는 UFW를 비활성화하고 iptables로 직접 관리하거나, 
before.rules 파일에 규칙을 직접 반영하는 방식을 권장합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp; 1.6&amp;nbsp;적용&amp;nbsp;확인&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772174006339&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#1.6.1 ipset 확인
ipset list

#1.6.2 iptables 확인
iptables -L -n

#1.6.3 특정 국가 차단 여부 확인

iptables -L -n | grep {국가}
iptables -L -n | grep brazil&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;2. 서버 재부팅으로 초기화 되었을 경우&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #409d00;&quot;&gt; 우분투 운영체제는 기본적으로 iptables와 ipset 설정이 메모리 상에서 동작합니다. 따라서 서버를 재부팅하면 기존 설정이 모두 사라지므로, 운영 환경에서는 반드시 설정을 영구적으로 저장하는 과정이 필요합니다.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; 2.1 iptables 영구 저장&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iptables-persistent 패키지를 설치하면 현재 적용된 규칙들을 파일로 저장하고 부팅 시 자동으로 불러올 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772175032172&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#iptables-persistent 패키지를 사용하므로 설치.
apt install iptables-persistent

#iptables 규칙이 아래 파일에 저장됨.
/etc/iptables/rules.v4
/etc/iptables/rules.v6&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; 2.2 수동 저장&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 변경 후에는 아래 명령어를 통해 현재 상태를 수동으로 파일에 기록해 두어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772175324098&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#iptables 저장
netfilter-persistent save

# 또는 수동저장
iptables-save &amp;gt; /etc/iptables/rules.v4

#ipset 저장
ipset save &amp;gt; /etc/ipset.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;2.3 ipset 부팅 시 자동 복원 서비스 생성 (한 번만 설정)&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ipset은&amp;nbsp;별도의&amp;nbsp;서비스&amp;nbsp;등록이&amp;nbsp;필요할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;br /&gt;시스템&amp;nbsp;부팅&amp;nbsp;시&amp;nbsp;저장해둔&amp;nbsp;ipset.conf&amp;nbsp;파일을&amp;nbsp;자동으로&amp;nbsp;불러오도록&amp;nbsp;systemd&amp;nbsp;서비스를&amp;nbsp;생성해&amp;nbsp;줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772176039430&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 생성 후 내용 추가
vim /etc/systemd/system/ipset-restore.service

[Unit]
Description=Restore ipset rules
Before=netfilter-persistent.service
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/sbin/ipset restore &amp;lt; /etc/ipset.conf
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target


#저장 후 실행
systemctl daemon-reload
systemctl enable ipset-restore
systemctl start ipset-restore&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.4 서비스 상태 확인&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 서비스가 정상적으로 동작하고 있는지 상태를 점검합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772175420609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl status netfilter-persistent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리눅스보안</category>
      <category>ipset</category>
      <category>iptables</category>
      <category>ip차단</category>
      <category>Linux보안</category>
      <category>oops-firwall</category>
      <category>국가IP차단</category>
      <category>보안설정</category>
      <category>서버방화벽</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/38</guid>
      <comments>https://https443.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 6 Mar 2026 08:07:38 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 방화벽 최적화 - ipset 설정으로 대량 IP 차단하는 방법 (CentOS)</title>
      <link>https://https443.tistory.com/37</link>
      <description>&lt;h2 data-end=&quot;120&quot; data-start=&quot;17&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;1. ipset?&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&lt;br /&gt;ipset은&amp;nbsp;리눅스&amp;nbsp;커널&amp;nbsp;방화벽인&amp;nbsp;netfilter&amp;nbsp;및&amp;nbsp;iptables와&amp;nbsp;연동하여&amp;nbsp;사용하는&amp;nbsp;관리&amp;nbsp;도구입니다.&amp;nbsp;&lt;br /&gt;여러&amp;nbsp;개의&amp;nbsp;IP&amp;nbsp;주소,&amp;nbsp;네트워크&amp;nbsp;대역,&amp;nbsp;포트&amp;nbsp;번호&amp;nbsp;등을&amp;nbsp;하나의&amp;nbsp;'집합(Set)'&amp;nbsp;형태로&amp;nbsp;저장하여&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;점이&amp;nbsp;특징입니다.&amp;nbsp;&lt;br /&gt;특히&amp;nbsp;방대한&amp;nbsp;양의&amp;nbsp;IP&amp;nbsp;목록을&amp;nbsp;효율적으로&amp;nbsp;차단하거나&amp;nbsp;허용해야&amp;nbsp;할&amp;nbsp;때,&amp;nbsp;&lt;br /&gt;기존의&amp;nbsp;iptables보다&amp;nbsp;훨씬&amp;nbsp;빠른&amp;nbsp;처리&amp;nbsp;속도를&amp;nbsp;제공하며&amp;nbsp;관리&amp;nbsp;또한&amp;nbsp;매우&amp;nbsp;간편합니다.&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-start=&quot;17&quot; data-end=&quot;120&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;2. ipset을 사용하는 이유&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-end=&quot;301&quot; data-start=&quot;222&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp;2.1. 많은 IP 처리 시 성능 우수함&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&amp;gt; 기존&amp;nbsp;iptables는&amp;nbsp;등록된&amp;nbsp;규칙이&amp;nbsp;많아질수록&amp;nbsp;패킷을&amp;nbsp;검사하는&amp;nbsp;시간이&amp;nbsp;길어져&amp;nbsp;시스템&amp;nbsp;성능이&amp;nbsp;저하될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;br /&gt;반면&amp;nbsp;ipset은&amp;nbsp;아무리&amp;nbsp;많은&amp;nbsp;IP가&amp;nbsp;등록되어&amp;nbsp;있어도&amp;nbsp;세트&amp;nbsp;단위로&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;검사하기&amp;nbsp;때문에&amp;nbsp;훨씬&amp;nbsp;빠른&amp;nbsp;속도를&amp;nbsp;유지합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;303&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; 2.2. 업데이트 쉬움&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&amp;gt; iptables&amp;nbsp;규칙을&amp;nbsp;매번&amp;nbsp;추가하거나&amp;nbsp;삭제할&amp;nbsp;필요&amp;nbsp;없이,&amp;nbsp;&lt;br /&gt;미리&amp;nbsp;생성해&amp;nbsp;둔&amp;nbsp;세트에&amp;nbsp;IP를&amp;nbsp;추가하거나&amp;nbsp;제거하는&amp;nbsp;것만으로&amp;nbsp;즉시&amp;nbsp;관리가&amp;nbsp;가능하여&amp;nbsp;운영&amp;nbsp;편의성이&amp;nbsp;높습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-end=&quot;383&quot; data-start=&quot;369&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; 2.3. 다양한 형태 지원함&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;단순한 IP 주소 외에도 다음과 같은 다양한 형식을 지원하여 유연한 방화벽 정책을 세울 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;449&quot; data-start=&quot;384&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;393&quot; data-start=&quot;384&quot;&gt;단일 IP&lt;/li&gt;
&lt;li data-end=&quot;410&quot; data-start=&quot;394&quot;&gt;IP 대역 (CIDR)&lt;/li&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;411&quot;&gt;MAC 주소&lt;/li&gt;
&lt;li data-end=&quot;430&quot; data-start=&quot;422&quot;&gt;Port&lt;/li&gt;
&lt;li data-end=&quot;449&quot; data-start=&quot;431&quot;&gt;IP + Port 조합 등&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-end=&quot;120&quot; data-start=&quot;17&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;3. 사용 방법&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt; 3.1 ipset 설치 (없는 경우) 및 확인&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 시스템에 ipset을 설치해야 합니다. CentOS 계열의 운영체제를 기준으로 설치 및 모듈 확인 방법은 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772154464373&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#설치 (centos 기준)
yum install ipset

#모듈 확인
lsmod | grep ip_set&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6A21H/dJMcagq3ylV/nJb7SCRWSjxIoXQbMaaqkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6A21H/dJMcagq3ylV/nJb7SCRWSjxIoXQbMaaqkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6A21H/dJMcagq3ylV/nJb7SCRWSjxIoXQbMaaqkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6A21H%2FdJMcagq3ylV%2FnJb7SCRWSjxIoXQbMaaqkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;57&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1772154925345&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#로드 안 되어 있으면 수동 로드
modprobe ip_set
modprobe ip_set_hash_net
modprobe xt_set&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;3.2 IP 대역 파일 다운로드&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국가별 IP 대역 데이터를 관리하기 위해 /etc 하단에 전용 디렉토리를 생성합니다. 예시로 브라질과 중국의 IP 대역 파일을 다운로드해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772155824757&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# * /etc 밑에 ipset 디렉토리 생성 후 진행
mkdir -p /etc/ipset

# 국가별 IP 대역 다운로드 (브라질, 중국 IP 차단 예시)

# 브라질 IP
wget -qO /etc/ipset/br.zone https://www.ipdeny.com/ipblocks/data/countries/br.zone

# 중국 IP
wget -qO /etc/ipset/cn.zone https://www.ipdeny.com/ipblocks/data/countries/cn.zone&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQh8h/dJMcabXAFYv/6uK78kxisdhbSCGkCKUGLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQh8h/dJMcabXAFYv/6uK78kxisdhbSCGkCKUGLk/img.png&quot; data-alt=&quot;다운 받은 파일을 열어보면 많은 양의 IP 대역대가 기입 되어 있는 것을 확인 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQh8h/dJMcabXAFYv/6uK78kxisdhbSCGkCKUGLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQh8h%2FdJMcabXAFYv%2F6uK78kxisdhbSCGkCKUGLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;121&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다운 받은 파일을 열어보면 많은 양의 IP 대역대가 기입 되어 있는 것을 확인 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp; &lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; 3.3 ipset 세트 생성&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 국가별 데이터를 담을 ipset 세트를 각각 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772156127529&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 브라질
ipset create brazil hash:net

# 중국
ipset create china hash:net&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; 3.4세트에 IP 대역 추가&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;파일로 내려받은 IP 대역 정보를 for 반복문을 사용하여 방금 생성한 세트에 하나씩 등록해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772156182768&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 브라질
for i in $(cat /etc/ipset/br.zone); do
    ipset add brazil $i
done

# 중국
for i in $(cat /etc/ipset/cn.zone); do
    ipset add china $i
done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3.5 적용&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772159173524&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 3.5.1 iptables에서 ipset 적용
#등록된 세트를 실제 방화벽 규칙에 적용하여 특정 국가의 접속을 차단합니다.

# 브라질 차단
iptables -A INPUT -m set --match-set brazil src -j DROP

# 중국 차단
iptables -A INPUT -m set --match-set china src -j DROP


# 3.5.2 oops-firewall에서 user.conf 사용하는 경우
#만약 oops-firewall을 사용 중이라면 user.conf 파일을 수정하여 설정을 반영할 수 있습니다.

vim /etc/oops-firewall/user.conf

# 브라질 차단
%-A INPUT -m set --match-set brazil src -j DROP

# 중국 차단
%-A INPUT -m set --match-set china src -j DROP

service oops-firewall restart&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;i&gt;&lt;s&gt;oops-firewall 설치 및 사용 방법은 아래 글 확인&lt;/s&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://https443.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://https443.tistory.com/11&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;i&gt;&lt;b&gt;3.6 적용&amp;nbsp;확인&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;설정이 정상적으로 완료되었는지 아래 명령어들로 최종 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772159296146&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#3.6.1 ipset 확인
ipset list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ylpwV/dJMcaibmBvw/Cq1qvKMJroPg6P7hWqJZH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ylpwV/dJMcaibmBvw/Cq1qvKMJroPg6P7hWqJZH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ylpwV/dJMcaibmBvw/Cq1qvKMJroPg6P7hWqJZH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FylpwV%2FdJMcaibmBvw%2FCq1qvKMJroPg6P7hWqJZH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;206&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1772159452517&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 3.6.2 iptables 확인

iptables -L -n

iptables -L -n | grep {차단국가}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sVbfS/dJMcaiCoeo6/ARzmKQh3cJtb4buJYkY8WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sVbfS/dJMcaiCoeo6/ARzmKQh3cJtb4buJYkY8WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sVbfS/dJMcaiCoeo6/ARzmKQh3cJtb4buJYkY8WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsVbfS%2FdJMcaiCoeo6%2FARzmKQh3cJtb4buJYkY8WK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;38&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리눅스보안</category>
      <category>ipset</category>
      <category>iptables</category>
      <category>ip차단</category>
      <category>Linux보안</category>
      <category>oops-firwall</category>
      <category>국가IP차단</category>
      <category>보안설정</category>
      <category>서버방화벽</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/37</guid>
      <comments>https://https443.tistory.com/37#entry37comment</comments>
      <pubDate>Fri, 27 Feb 2026 21:23:15 +0900</pubDate>
    </item>
    <item>
      <title>Microsoft Edge의 IE 모드 사용 방법</title>
      <link>https://https443.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근&amp;nbsp;웹&amp;nbsp;환경은&amp;nbsp;대부분&amp;nbsp;Chrome이나&amp;nbsp;최신&amp;nbsp;Edge&amp;nbsp;브라우저를&amp;nbsp;중심으로&amp;nbsp;운영되고&amp;nbsp;있습니다.&amp;nbsp;하지만&amp;nbsp;과거에&amp;nbsp;제작된&amp;nbsp;홈페이지&amp;nbsp;중에는&amp;nbsp;여전히&amp;nbsp;구버전&amp;nbsp;기술을&amp;nbsp;기반으로&amp;nbsp;하는&amp;nbsp;곳들이&amp;nbsp;꽤&amp;nbsp;존재합니다.&lt;br /&gt;&lt;br /&gt;- 구버전 홈페이지의 특징&lt;/p&gt;
&lt;pre id=&quot;code_1771571296282&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. ActiveX 기반 기능 사용 사이트

2. 구 Internet Explorer 전용 스크립트 적용된 페이지

3. 오래된 웹에디터 사용 사이트

4. 특정 공공&amp;middot;기업 내부 시스템 등등&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한 사이트들은 최신 브라우저에서 접속할 경우 다음과 같은 문제가 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1771571376170&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 화면 깨짐

2. 버튼 클릭 안 됨

3 .로그인 오류

4. 스크립트 오류

5. 403 또는 접근 차단 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;오늘은&amp;nbsp;과거&amp;nbsp;홈페이지&amp;nbsp;출력&amp;nbsp;문제&amp;nbsp;발생&amp;nbsp;시&amp;nbsp;확인하고&amp;nbsp;해결하는&amp;nbsp;방법을&amp;nbsp;정리해&amp;nbsp;보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt; 1. 언제 IE 모드를 사용하는가?&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재&amp;nbsp;Internet&amp;nbsp;Explorer(IE)는&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;공식적으로&amp;nbsp;지원이&amp;nbsp;종료&lt;/span&gt;된&amp;nbsp;상태이지만,&amp;nbsp;기술적으로&amp;nbsp;완전히&amp;nbsp;사라진&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;&lt;br /&gt;여전히&amp;nbsp;구버전&amp;nbsp;사이트&amp;nbsp;중&amp;nbsp;상당수가&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;IE&amp;nbsp;전용&amp;nbsp;기술을&amp;nbsp;기반으로&amp;nbsp;구축되어&amp;nbsp;있기&amp;nbsp;때문입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1771571655384&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. ActiveX

2. VBScript

3. document.all 기반 스크립트

4. IE 전용 CSS 해석 방식&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한&amp;nbsp;기술들은&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;Chrome이나&amp;nbsp;최신&amp;nbsp;Edge의&amp;nbsp;기본&amp;nbsp;엔진에서는&amp;nbsp;동작하지&amp;nbsp;않습니다&lt;/span&gt;.&amp;nbsp;&lt;br /&gt;&amp;gt;위 사항에 해당되는 홈페이지를 정상적으로 확인하기 위해 사용하는 기능이 바로 &lt;span style=&quot;color: #006dd7;&quot;&gt;Microsoft Edge의 IE 모드&lt;/span&gt;입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;2. IE 모드 사용 방법&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; 2.1 Microsoft&amp;nbsp;Edge를&amp;nbsp;실행한&amp;nbsp;후,&amp;nbsp;오른쪽&amp;nbsp;상단의&amp;nbsp;[...]&amp;nbsp;아이콘을&amp;nbsp;클릭하고&amp;nbsp;[설정]&amp;nbsp;메뉴로&amp;nbsp;들어갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/njNeO/dJMcad11Qw4/fWCwSbwOWOLK3tfM7NF79k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/njNeO/dJMcad11Qw4/fWCwSbwOWOLK3tfM7NF79k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/njNeO/dJMcad11Qw4/fWCwSbwOWOLK3tfM7NF79k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnjNeO%2FdJMcad11Qw4%2FfWCwSbwOWOLK3tfM7NF79k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;435&quot; height=&quot;788&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;br /&gt;2.2&amp;nbsp; 좌측&amp;nbsp;메뉴에서&amp;nbsp;[기본&amp;nbsp;브라우저]&amp;nbsp;탭을&amp;nbsp;클릭합니다.&lt;br /&gt;&amp;nbsp;'Internet Explorer 모드(IE 모드)에서 사이트를 다시 로드하도록 허용' 설정을 **[허용]**으로 선택합니다.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNLYZo/dJMcagxIwrC/Qr0Y5LQjCOnb7MBUl3TDA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNLYZo/dJMcagxIwrC/Qr0Y5LQjCOnb7MBUl3TDA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNLYZo/dJMcagxIwrC/Qr0Y5LQjCOnb7MBUl3TDA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNLYZo%2FdJMcagxIwrC%2FQr0Y5LQjCOnb7MBUl3TDA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;539&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;이후 '페이지 추가' 버튼을 클릭하여 확인이 필요한 도메인 주소를 입력합니다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci1hnm/dJMcaiPNW24/qqZEMkplUBEy3W4oQt6Tlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci1hnm/dJMcaiPNW24/qqZEMkplUBEy3W4oQt6Tlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci1hnm/dJMcaiPNW24/qqZEMkplUBEy3W4oQt6Tlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci1hnm%2FdJMcaiPNW24%2FqqZEMkplUBEy3W4oQt6Tlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;165&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.3 접속 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Microsoft Edge를 재실행한 뒤 추가한 도메인으로 접속하면, 주소창 왼쪽에 IE 모드 마크가 표시되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8l5q6/dJMcaih0JTO/8TrZ2VIlGBcKczuyKDiqS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8l5q6/dJMcaih0JTO/8TrZ2VIlGBcKczuyKDiqS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8l5q6/dJMcaih0JTO/8TrZ2VIlGBcKczuyKDiqS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8l5q6%2FdJMcaih0JTO%2F8TrZ2VIlGBcKczuyKDiqS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;30&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;3. IE 모드와 Trident의 관계 및 차단으로 인한 문제&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&lt;/i&gt;&lt;/b&gt;3.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1 Trident란 무엇인가?&lt;/span&gt;&lt;br /&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25&quot;&gt;Trident&lt;/b&gt;는 Microsoft Internet Explorer의 핵심 렌더링 엔진입니다. &lt;br /&gt;웹페이지의 소스코드를 해석하여 화면에 그려주는 중추적인 역할을 담당합니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt; 3.2 Trident와&amp;nbsp;구버전&amp;nbsp;홈페이지의&amp;nbsp;관계&lt;/span&gt;&lt;br /&gt;과거의 홈페이지들은 &quot;IE에서의 정상 동작&quot;을 최우선 기준으로 개발된 경우가 많습니다. 이로 인해 최신 표준 브라우저로 접속하면 다음과 같은 충돌이 발생합니다. &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771574300291&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. DOM 구조가 다르게 해석됨

2. ActiveX 실행 불가

3. 보안 정책 차이로 차단 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;3.3 IE&amp;nbsp;모드와&amp;nbsp;Trident의&amp;nbsp;관계&lt;/span&gt;&lt;br /&gt;Edge의 IE 모드는 내부적으로 Trident 엔진을 호출하여 페이지를 로드합니다. &lt;br /&gt;따라서 최신 브라우저 안에서도 구버전 홈페이지를 정상적으로 이용할 수 있게 됩니다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;3.4 Trident&amp;nbsp;차단으로&amp;nbsp;403이&amp;nbsp;발생한&amp;nbsp;사례&lt;/span&gt;&lt;br /&gt;보안 설정 중 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;32&quot;&gt;User-Agent 차단 정책&lt;/b&gt;을 적용할 때 주의가 필요합니다. &lt;br /&gt;만약 차단 목록에 'Trident' 문자열이 포함되어 있다면, 해당 서버는 IE 사용자 전체를 차단하게 됩니다. &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;33&quot;&gt;발생 결과:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;34&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IE 또는 Edge의 IE 모드로 접속 시 &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;34,0,0&quot;&gt;403 Forbidden&lt;/b&gt; 에러가 출력됩니다.&lt;/li&gt;
&lt;li&gt;이는 IE 모드가 Trident 엔진을 사용하며, User-Agent 정보에도 Trident 값이 포함되기 때문입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;따라서 구형 시스템 지원을 위해 IE 모드를 활용해야 한다면, 방화벽이나 보안 소프트웨어의 봇 차단 목록에서 &lt;b data-index-in-node=&quot;61&quot; data-path-to-node=&quot;35&quot;&gt;Trident 항목을 제외&lt;/b&gt;해야 정상적인 접속이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>etc</category>
      <category>403</category>
      <category>Edge</category>
      <category>Forbidden</category>
      <category>IE모드</category>
      <category>Microsoft Edge</category>
      <category>TRIDENT</category>
      <category>User-agent</category>
      <category>구버전홈페이지</category>
      <category>브라우저설정</category>
      <author>https443</author>
      <guid isPermaLink="true">https://https443.tistory.com/36</guid>
      <comments>https://https443.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 20 Feb 2026 20:07:09 +0900</pubDate>
    </item>
  </channel>
</rss>