우분투로 간단하게 웹서버 만들기 ( Ubuntu 20.04 LTS webserver ) 쉽게 따라하기 > 우툰투 자료실

본문 바로가기

우툰투 자료실

우툰투 자료실 HOME


우분투로 간단하게 웹서버 만들기 ( Ubuntu 20.04 LTS webserver ) 쉽게 따라하기

페이지 정보

작성자 낙엽타는향기 댓글 0건 조회 7,026회 작성일 24-01-31 15:46

본문

Ubuntu 20.04 LTS Desktop 웹서버 구축 완전판

0. 최종 구성

이 문서는 다음 환경을 기준으로 합니다.

운영체제 : Ubuntu 20.04 LTS Desktop
웹서버   : Apache2
DB       : MySQL
PHP      : Ubuntu 20.04 기본 PHP
DB관리   : phpMyAdmin
SSH      : OpenSSH Server
FTP      : vsftpd
방화벽   : UFW
SSL      : Let's Encrypt + Certbot

예제 도메인
pcjoin.com
www.pcjoin.com

예제 웹루트
/var/www/html/pcjoin/g5

중요한 기본 원칙은 다음과 같습니다.

1. HTTP 웹서버부터 완성
2. 내부접속 확인
3. 외부접속 확인
4. DNS 확인
5. 마지막에 SSL 인증서 발급
6. HTTPS 강제전환

처음부터 SSL 설정을 넣지 않습니다.


1. Ubuntu 설치 후 시스템 업데이트

터미널을 열고 먼저 전체 패키지 정보를 갱신합니다.

sudo apt update
sudo apt upgrade -y

필요하면 재부팅합니다.

sudo reboot

2. nano 설치

Ubuntu에는 대부분 nano가 설치되어 있지만 확인 겸 설치합니다.

sudo apt install nano -y

3. root 계정에 대한 권장 방식

웹서버 구축을 위해 GUI에서 root로 로그인할 필요는 없습니다.

따라서 기존에 사용하던 다음 설정은 하지 않는 것을 권장합니다.

/etc/gdm3/custom.conf
AllowRoot=true

/etc/pam.d/gdm-password
pam_succeed_if 관련 주석처리

일반 사용자로 로그인한 상태에서 필요할 때:

sudo 명령어

를 사용하면 됩니다.

일시적으로 root shell이 필요하면:

sudo -i

를 사용합니다.

끝낼 때:

exit

4. 서버 내부 IP 확인

먼저 서버 IP를 확인합니다.

ip addr

또는:

hostname -I

예:

192.168.0.100

이 IP는 나중에 공유기 포트포워딩에 사용됩니다.

웹서버는 내부 IP가 바뀌지 않는 것이 중요하므로 공유기에서:

DHCP IP 예약

또는 Ubuntu에서 고정 IP를 설정하는 것이 좋습니다.

예:

Ubuntu 서버
192.168.0.100

5. SSH 서버 설치

원격 관리를 위해 OpenSSH Server를 설치합니다.

sudo apt install openssh-server -y

Ubuntu에서는 원격 SSH 서버 패키지로 openssh-server를 사용합니다.

서비스 활성화:

sudo systemctl enable ssh
sudo systemctl start ssh

상태 확인:

sudo systemctl status ssh

정상이면:

active (running)

으로 표시됩니다.

다른 PC에서 테스트:

ssh 사용자명@192.168.0.100

6. UFW 방화벽 설정

방화벽 상태 확인:

sudo ufw status

먼저 SSH를 허용합니다.

sudo ufw allow 22/tcp

웹서버 HTTP:

sudo ufw allow 80/tcp

HTTPS:

sudo ufw allow 443/tcp

FTP를 사용할 경우:

sudo ufw allow 21/tcp

방화벽 활성화:

sudo ufw enable

확인:

sudo ufw status verbose

최소한 다음과 비슷해야 합니다.

22/tcp   ALLOW
80/tcp   ALLOW
443/tcp  ALLOW
21/tcp   ALLOW

Apache가 설치된 이후에는 다음 방법도 사용할 수 있습니다.

sudo ufw allow 'Apache Full'

Apache Full은 일반적으로 HTTP 80과 HTTPS 443을 모두 허용합니다.


7. LAMP 설치

Apache + MySQL + PHP를 한꺼번에 설치합니다.

sudo apt update
sudo apt install lamp-server^ -y

Ubuntu의 task 방식으로 설치하려면:

sudo apt install tasksel -y
sudo tasksel install lamp-server

를 사용해도 됩니다.

둘 중 하나만 하면 됩니다.

설치된 서비스 확인:

sudo systemctl status apache2
sudo systemctl status mysql

Apache가 실행 중이어야 합니다.


8. Apache 기본 접속 확인

Ubuntu 서버 자체에서 웹브라우저를 열고:

http://localhost

접속합니다.

또는:

http://127.0.0.1

다른 같은 네트워크의 PC에서는:

http://192.168.0.100

처럼 서버 IP로 접속합니다.

Apache 기본 페이지가 나오면 정상입니다.

이 단계에서 접속이 안 된다면 SSL이나 DNS 문제를 볼 필요가 없습니다.

먼저 Apache 문제부터 해결해야 합니다.


9. Apache 기본 모듈 활성화

그누보드, 라이믹스 등의 Rewrite 기능을 위해:

sudo a2enmod rewrite

SSL 모듈도 미리 활성화할 수 있습니다.

sudo a2enmod ssl

HTTP 헤더가 필요한 경우:

sudo a2enmod headers

설정 적용:

sudo systemctl restart apache2

10. Apache AllowOverride 설정

파일 열기:

sudo nano /etc/apache2/apache2.conf

다음 부분을 찾습니다.

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

다음과 같이 변경합니다.

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

저장:

Ctrl + O
Enter
Ctrl + X

설정 검사:

sudo apache2ctl configtest

정상이면:

Syntax OK

이 나옵니다.

그 다음:

sudo systemctl restart apache2

11. 웹사이트 디렉터리 생성

예제:

sudo mkdir -p /var/www/html/pcjoin/g5

테스트용 index 파일을 하나 만듭니다.

sudo nano /var/www/html/pcjoin/g5/index.html

내용:

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>PCJOIN TEST</title>
</head>
<body>
<h1>PCJOIN WEB SERVER OK</h1>
</body>
</html>

12. 웹폴더 권한 설정

웹서버 운영 방식에 따라 권한 정책은 달라질 수 있지만 기본 예시는 다음과 같습니다.

sudo chown -R www-data:www-data /var/www/html/pcjoin

일반 사용자가 파일을 직접 관리해야 하는 경우에는 그룹 권한을 별도로 설계하는 것이 더 좋습니다.

무조건:

chmod -R 777

을 사용하는 것은 피합니다.


13. HTTP 가상호스트 만들기

이 단계에서는 절대로 HTTPS 강제전환을 넣지 않습니다.

파일 생성:

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

다음을 입력합니다.

<VirtualHost *:80>

    ServerAdmin webmaster@localhost

    ServerName pcjoin.com
    ServerAlias www.pcjoin.com

    DocumentRoot /var/www/html/pcjoin/g5

    <Directory /var/www/html/pcjoin/g5>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/pcjoin_error.log
    CustomLog ${APACHE_LOG_DIR}/pcjoin_access.log combined

</VirtualHost>

저장합니다.


14. 가상호스트 활성화

sudo a2ensite pcjoin.conf

기본 Apache 사이트는 필요 없다면 비활성화합니다.

sudo a2dissite 000-default.conf

반드시 설정 검사:

sudo apache2ctl configtest

정상:

Syntax OK

VirtualHost 확인:

sudo apache2ctl -S

이 명령은 실제 Apache가 어떤 VirtualHost를 사용하는지 확인하는 데 매우 중요합니다.

정상이면 Apache 재시작:

sudo systemctl restart apache2

15. Apache가 실제 80포트를 사용 중인지 확인

sudo ss -lntp | grep ':80'

다음과 비슷하게 나오면 정상입니다.

LISTEN ... 0.0.0.0:80

또는:

*:80

16. 내부 네트워크 웹접속 확인

다른 PC 또는 휴대폰에서 같은 공유기에 연결한 뒤:

http://192.168.0.100

으로 접속합니다.

앞에서 만든:

PCJOIN WEB SERVER OK

가 나오면 서버와 Apache는 정상입니다.

이 검사를 반드시 먼저 완료합니다.


17. 공유기 포트포워딩

외부 인터넷에서 접속하기 위해서는 공유기 포트포워딩이 필요합니다.

Ubuntu 서버 IP가:

192.168.0.100

이라면 공유기에 다음과 같이 설정합니다.

서비스    외부포트     내부IP           내부포트     프로토콜

HTTP      80           192.168.0.100    80           TCP
HTTPS     443          192.168.0.100    443          TCP
SSH       22           192.168.0.100    22           TCP
FTP       21           192.168.0.100    21           TCP

SSH 22번과 FTP 21번은 외부 사용이 필요할 때만 열어도 됩니다.

웹서버에는 최소:

80
443

이 필요합니다.


18. 공인 IP 확인

서버의 공인 IP를 확인합니다.

예:

curl ifconfig.me

공유기 관리자 화면의:

WAN IP
인터넷 IP
공인 IP

와 비교합니다.

예:

123.123.123.123

19. CGNAT 여부 확인

매우 중요합니다.

공유기의 WAN IP와 인터넷에서 확인되는 공인 IP가 서로 다르면:

CGNAT
이중 NAT
상위 공유기

환경일 가능성이 있습니다.

이 경우 단순 포트포워딩만으로 외부 서버 접속이 안 될 수 있습니다.

특히 공유기의 WAN IP가 다음 대역이면 확인이 필요합니다.

10.x.x.x
172.16.x.x ~ 172.31.x.x
192.168.x.x
100.64.x.x ~ 100.127.x.x

이 경우 ISP 또는 상위 라우터 구성을 확인해야 합니다.


20. DNS 설정

도메인의 DNS 관리 페이지에서:

pcjoin.com
www.pcjoin.com

이 서버의 공인 IP를 바라보게 합니다.

예:

A 레코드

@      123.123.123.123
www    123.123.123.123

또는 www는 CNAME으로:

www → pcjoin.com

으로 구성할 수도 있습니다.


21. DNS 적용 확인

서버 또는 다른 PC에서:

nslookup pcjoin.com

그리고:

nslookup www.pcjoin.com

결과가 서버의 공인 IP와 같아야 합니다.

Linux에서는:

dig pcjoin.com

도 사용할 수 있습니다.


22. SSL 설치 전에 외부 HTTP 접속 확인

휴대폰 Wi-Fi를 끄고 LTE/5G에서 다음 주소로 접속합니다.

http://pcjoin.com

그리고:

http://www.pcjoin.com

둘 다 웹페이지가 떠야 합니다.

이 단계가 성공하지 않으면 Certbot을 진행하지 않습니다.

Certbot 인증 과정에서 외부에서 서버에 접근할 수 있어야 하기 때문입니다.


23. phpMyAdmin 설치

sudo apt update
sudo apt install phpmyadmin -y

설치 과정에서 웹서버를 선택하라는 화면이 나오면:

apache2

를 선택합니다.

Space 키로 apache2에 체크한 뒤 Enter를 누릅니다.

DB 설정 질문이 나오면 일반적으로:

Yes

를 선택합니다.


24. phpMyAdmin Apache 설정 확인

대부분 자동으로 연결됩니다.

접속:

http://localhost/phpmyadmin

또는:

http://192.168.0.100/phpmyadmin

만약 404 오류가 발생하면:

sudo nano /etc/apache2/apache2.conf

맨 아래에 다음이 있는지 확인합니다.

Include /etc/phpmyadmin/apache.conf

없다면 추가합니다.

설정 검사:

sudo apache2ctl configtest

그리고:

sudo systemctl restart apache2

25. MySQL 상태 확인

sudo systemctl status mysql

필요하면:

sudo systemctl enable mysql
sudo systemctl start mysql

MySQL 콘솔 접속:

sudo mysql

Ubuntu의 기본 MySQL root 계정은 시스템 root 인증 방식으로 설정되어 있을 수 있기 때문에 반드시:

mysql -u root -p

방식으로 접속할 필요는 없습니다.


26. 웹사이트용 MySQL 관리자 계정 만들기

중요:

웹사이트 프로그램에 MySQL의 전체 root급 계정을 사용하는 것은 권장하지 않습니다.

먼저:

sudo mysql

예를 들어 phpMyAdmin 관리용 사용자를 만든다면:

CREATE USER 'pcjoinadmin'@'localhost' IDENTIFIED BY '강력한비밀번호';

관리 목적으로 전체 DB 권한이 필요하다면:

GRANT ALL PRIVILEGES ON *.* TO 'pcjoinadmin'@'localhost' WITH GRANT OPTION;

적용:

FLUSH PRIVILEGES;

종료:

EXIT;

그 다음 phpMyAdmin에서:

아이디 : pcjoinadmin
비밀번호 : 설정한 비밀번호

로 로그인합니다.


27. 일반 웹사이트 DB 계정은 별도로 생성

그누보드 같은 웹사이트에는 관리자 전체권한 계정 대신 해당 DB만 사용할 수 있는 계정을 만드는 것이 좋습니다.

예:

sudo mysql

DB 생성:

CREATE DATABASE pcjoin
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

웹사이트 사용자 생성:

CREATE USER 'pcjoin'@'localhost'
IDENTIFIED BY '강력한비밀번호';

해당 DB만 권한 부여:

GRANT ALL PRIVILEGES ON pcjoin.* TO 'pcjoin'@'localhost';

적용:

FLUSH PRIVILEGES;

종료:

EXIT;

그누보드 설정에는 이 계정을 사용합니다.


28. vsftpd 설치

FTP가 반드시 필요한 경우에만 설치합니다.

sudo apt update
sudo apt install vsftpd -y

서비스 시작:

sudo systemctl enable vsftpd
sudo systemctl start vsftpd

확인:

sudo systemctl status vsftpd

29. FTP 사용자 생성

예:

sudo adduser pcjoin

이 명령을 사용하면:

사용자 홈 디렉터리 생성
비밀번호 설정
기본 shell 설정

을 함께 처리하므로 기존의:

useradd -m
passwd

방식보다 편리합니다.


30. vsftpd 기본 설정

백업부터 합니다.

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup

편집:

sudo nano /etc/vsftpd.conf

기본적으로 다음 항목을 확인합니다.

listen=NO
listen_ipv6=YES

anonymous_enable=NO
local_enable=YES
write_enable=YES

local_umask=022

chroot_local_user=YES
allow_writeable_chroot=YES

utf8_filesystem=YES

Passive FTP를 사용할 경우:

pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100

추가합니다.

재시작:

sudo systemctl restart vsftpd

31. FTP Passive 포트 방화벽 설정

Passive 범위를:

40000 ~ 40100

으로 지정했다면:

sudo ufw allow 40000:40100/tcp

공유기에서도 동일하게:

40000 ~ 40100 TCP
      ↓
192.168.0.100

으로 포트포워딩해야 외부 FTP가 정상 동작합니다.


32. SSL 설치 준비

이제 다음 네 가지가 모두 정상인지 확인합니다.

① http://pcjoin.com 접속 가능

② http://www.pcjoin.com 접속 가능

③ DNS가 현재 공인 IP를 가리킴

④ 공유기 80,443 포트포워딩 완료

모두 정상일 때 SSL을 진행합니다.


33. Certbot 설치

Ubuntu 20.04에서 패키지 방식으로 설치할 경우:

sudo apt update
sudo apt install certbot python3-certbot-apache -y

예전 문서의:

python-certbot-apache
ppa:certbot/certbot
apt-key

방식은 사용하지 않습니다.


34. Let's Encrypt 인증서 발급

pcjoin.com과 www.pcjoin.com을 하나의 인증서에 포함합니다.

sudo certbot --apache -d pcjoin.com -d www.pcjoin.com

진행 중 이메일 주소를 입력합니다.

약관 동의:

Y

HTTP를 HTTPS로 자동 리다이렉트할 것인지 묻는 버전에서는 HTTPS Redirect를 선택해도 됩니다.

Certbot이 Apache를 분석하여 SSL VirtualHost 및 인증서 설정을 처리하도록 맡기는 것이 가장 안전합니다.


35. 인증서 확인

인증서 목록:

sudo certbot certificates

대략 다음과 같이 표시됩니다.

Certificate Name: pcjoin.com
Domains: pcjoin.com www.pcjoin.com

인증서 경로 예:

/etc/letsencrypt/live/pcjoin.com/fullchain.pem
/etc/letsencrypt/live/pcjoin.com/privkey.pem

www.pcjoin.com용 디렉터리를 따로 만들 필요가 없습니다.


36. Certbot이 만든 HTTPS 가상호스트 확인

다음 디렉터리를 확인합니다.

ls -l /etc/apache2/sites-available/

Certbot이 다음과 비슷한 파일을 만들 수 있습니다.

pcjoin.conf
pcjoin-le-ssl.conf

확인:

sudo nano /etc/apache2/sites-available/pcjoin-le-ssl.conf

예:

<IfModule mod_ssl.c>

<VirtualHost *:443>

    ServerName pcjoin.com
    ServerAlias www.pcjoin.com

    DocumentRoot /var/www/html/pcjoin/g5

    <Directory /var/www/html/pcjoin/g5>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/pcjoin_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/pcjoin_ssl_access.log combined

    SSLEngine on

    SSLCertificateFile /etc/letsencrypt/live/pcjoin.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/pcjoin.com/privkey.pem

</VirtualHost>

</IfModule>

Certbot이 만든 설정은 특별한 이유가 없다면 수동 수정하지 않는 것이 좋습니다.


37. HTTPS 강제 리다이렉트

Certbot에서 자동 Redirect를 선택하지 않았다면 HTTP VirtualHost를 다음처럼 구성할 수 있습니다.

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

예:

<VirtualHost *:80>

    ServerName pcjoin.com
    ServerAlias www.pcjoin.com

    RewriteEngine On
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

</VirtualHost>

또는 Apache Redirect 지시문을 사용하여 더 단순하게:

<VirtualHost *:80>

    ServerName pcjoin.com
    ServerAlias www.pcjoin.com

    Redirect permanent / https://pcjoin.com/

</VirtualHost>

둘 중 하나를 사용합니다.


38. 기존 설정에서 제거해야 하는 잘못된 SSL Redirect

HTTPS VirtualHost 안에서는 다음과 같은 코드를 넣지 않습니다.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

443 VirtualHost에 들어온 요청은 이미 HTTPS이므로 필요 없습니다.

HTTP → HTTPS Redirect는 80포트 VirtualHost에서 처리합니다.


39. Apache 최종 검사

항상 재시작 전에:

sudo apache2ctl configtest

정상:

Syntax OK

VirtualHost 검사:

sudo apache2ctl -S

포트 확인:

sudo ss -lntp | grep -E ':80|:443'

정상이라면:

sudo systemctl restart apache2

40. HTTPS 최종 접속 테스트

다음 주소들을 모두 확인합니다.

http://pcjoin.com
http://www.pcjoin.com
https://pcjoin.com
https://www.pcjoin.com

HTTP 주소로 접속해도 최종적으로:

https://...

로 이동하면 정상입니다.


41. 인증서 자동 갱신 확인

Let's Encrypt 인증서는 영구 인증서가 아니므로 자동 갱신 설정이 중요합니다.

테스트:

sudo certbot renew --dry-run

성공하면 자동 갱신 구조는 정상입니다.

Certbot timer 확인:

systemctl list-timers | grep certbot

또는:

sudo systemctl status certbot.timer

설치 방식에 따라 timer 구조가 다를 수 있으므로 renew --dry-run 성공 여부가 가장 중요한 확인 사항입니다.


42. Apache/PHP/MySQL 서비스 자동 시작

Apache:

sudo systemctl enable apache2

MySQL:

sudo systemctl enable mysql

SSH:

sudo systemctl enable ssh

vsftpd 사용 시:

sudo systemctl enable vsftpd

43. PHP 정상 동작 테스트

테스트 파일 생성:

sudo nano /var/www/html/pcjoin/g5/phpinfo.php

내용:

<?php
phpinfo();

접속:

https://pcjoin.com/phpinfo.php

PHP 정보 페이지가 나오면 정상입니다.

테스트가 끝나면 보안상 반드시 삭제합니다.

sudo rm /var/www/html/pcjoin/g5/phpinfo.php

44. Apache 오류 발생 시 가장 먼저 사용할 명령

설정 문법 검사:

sudo apache2ctl configtest

Apache 상태:

sudo systemctl status apache2 --no-pager

상세 로그:

sudo journalctl -u apache2 -n 100 --no-pager

Apache 오류 로그:

sudo tail -100 /var/log/apache2/error.log

사이트 전용 로그:

sudo tail -100 /var/log/apache2/pcjoin_error.log

VirtualHost 구조:

sudo apache2ctl -S

포트 확인:

sudo ss -lntp | grep -E ':80|:443'

방화벽:

sudo ufw status verbose

45. 외부접속이 안 될 때 검사 순서

외부접속이 안 되면 무작정 Apache 설정을 수정하지 않습니다.

다음 순서대로 검사합니다.

① localhost 접속되는가?

http://localhost

       ↓

② 내부 IP 접속되는가?

http://192.168.0.100

       ↓

③ Apache가 80을 듣고 있는가?

ss -lntp

       ↓

④ UFW 80/443이 열려 있는가?

ufw status

       ↓

⑤ 공유기 포트포워딩 되었는가?

       ↓

⑥ 공유기 WAN IP가 진짜 공인 IP인가?

       ↓

⑦ DNS가 그 공인 IP를 가리키는가?

       ↓

⑧ 외부 LTE/5G에서 HTTP 접속되는가?

       ↓

⑨ Certbot 인증서 발급

       ↓

⑩ HTTPS 확인

이 방식이면 문제 위치를 정확히 찾을 수 있습니다.


46. Apache 재시작 전에 반드시 습관화할 명령

설정을 수정했다면 바로:

sudo systemctl restart apache2

하지 말고 먼저:

sudo apache2ctl configtest

를 합니다.

Syntax OK가 나온 경우에만:

sudo systemctl reload apache2

또는:

sudo systemctl restart apache2

를 실행합니다.

단순 설정 변경은 가능한 경우 reload가 더 부드럽습니다.


47. 여러 도메인을 운영할 경우

예:

pcjoin.com
i-medinet.com
joypc.or.kr

이라면 각각 별도의 VirtualHost 파일을 만듭니다.

/etc/apache2/sites-available/

pcjoin.conf
imedinet.conf
joypc.conf

예:

sudo a2ensite pcjoin.conf
sudo a2ensite imedinet.conf
sudo a2ensite joypc.conf

그 다음:

sudo apache2ctl configtest
sudo apache2ctl -S
sudo systemctl reload apache2

각 도메인의 DNS 역시 같은 서버 공인 IP를 가리키면 됩니다.


48. 두 번째 도메인의 SSL 추가

예를 들어:

i-medinet.com
www.i-medinet.com

을 추가했다면 HTTP 접속을 먼저 확인한 다음:

sudo certbot --apache \
-d i-medinet.com \
-d www.i-medinet.com

을 실행합니다.

도메인마다 별도의 인증서를 발급해도 됩니다.


49. phpMyAdmin 외부 노출 주의

phpMyAdmin을:

https://pcjoin.com/phpmyadmin

으로 인터넷에 그대로 공개하면 공격 시도가 많이 들어올 수 있습니다.

가능하면:

내부망에서만 접근
IP 제한
VPN 사용
Basic Authentication 추가
경로 변경

등을 고려하는 것이 좋습니다.

MySQL 3306 포트는 일반적인 웹서버에서는 공유기나 UFW에서 외부로 열 필요가 없습니다.

즉:

3306 외부 포트 개방하지 않음

을 기본으로 합니다.


50. SSH도 가능하면 외부 노출 최소화

SSH가 외부에서 필요하지 않다면 공유기에서 22번 포트포워딩을 하지 않습니다.

외부 SSH가 필요하다면:

SSH key 인증
PasswordAuthentication 제한
root SSH 로그인 금지
fail2ban

등을 추가하는 것이 좋습니다.

root GUI 로그인도 사용할 필요가 없습니다.


51. FTP보다 SFTP 권장

SSH가 설치되어 있다면 FileZilla에서도 SFTP를 사용할 수 있습니다.

예:

프로토콜:
SFTP - SSH File Transfer Protocol

호스트:
192.168.0.100

포트:
22

사용자:
pcjoin

SFTP를 사용하면:

FTP 21번
Passive FTP 포트
vsftpd

가 필요하지 않습니다.

따라서 특별히 FTP가 필요한 이유가 없다면:

FTP 대신 SFTP

를 권장합니다.


52. 최종적으로 필요한 외부 포트

SFTP를 사용하고 일반적인 웹서버를 구성한다면:

80 TCP    HTTP
443 TCP   HTTPS
22 TCP    SSH/SFTP   ← 외부 접속 필요할 때만

이면 충분합니다.

MySQL:

3306

은 열지 않습니다.

FTP를 사용하지 않으면:

21
40000~40100

역시 열 필요 없습니다.


53. 설치 완료 후 최종 점검 명령

한 번에 아래를 점검합니다.

sudo apache2ctl configtest
sudo apache2ctl -S
sudo systemctl status apache2 --no-pager
sudo systemctl status mysql --no-pager
sudo systemctl status ssh --no-pager
sudo ss -lntp | grep -E ':22|:80|:443'
sudo ufw status verbose
sudo certbot certificates
sudo certbot renew --dry-run

54. 최종 웹서버 구축 순서 요약

가장 안전한 순서는 다음과 같습니다.

Ubuntu 20.04 LTS 설치
       ↓
apt update / upgrade
       ↓
서버 내부 IP 고정
       ↓
OpenSSH 설치
       ↓
UFW 22/80/443 설정
       ↓
LAMP 설치
       ↓
Apache localhost 테스트
       ↓
rewrite 활성화
       ↓
웹 디렉터리 생성
       ↓
HTTP VirtualHost 생성
       ↓
a2ensite
       ↓
apache2ctl configtest
       ↓
apache2ctl -S
       ↓
내부 IP 접속 테스트
       ↓
공유기 80/443 포트포워딩
       ↓
공인 IP 확인
       ↓
DNS A 레코드 연결
       ↓
외부 HTTP 접속 테스트
       ↓
phpMyAdmin 설치
       ↓
웹사이트용 MySQL DB/계정 생성
       ↓
Certbot 설치
       ↓
certbot --apache
       ↓
HTTPS 연결
       ↓
HTTP → HTTPS 리다이렉트
       ↓
certbot renew --dry-run
       ↓
최종 완료

55. 가장 중요한 금지 사항

다음은 하지 않는 것이 좋습니다.

X 인증서를 만들기 전에 SSL VirtualHost 활성화

X 존재하지 않는 /etc/letsencrypt/live/... 파일을 Apache에서 참조

X configtest 없이 Apache restart

X 무조건 chmod -R 777

X MySQL 3306 인터넷 공개

X 웹프로그램에 MySQL 전체 root 계정 사용

X Apache가 내부에서 안 되는데 Certbot부터 실행

X DNS가 연결되지 않았는데 Certbot 실행

X 공유기 포트포워딩 없이 외부접속 시도

X Ubuntu Desktop GUI에서 root 로그인 허용

X FTP가 필요 없는데 21번과 Passive 포트를 개방

56. 문제가 생겼을 때 보내면 되는 진단 결과

웹서버 접속이 실패한다면 다음 결과를 확인합니다.

sudo apache2ctl configtest
sudo apache2ctl -S
sudo systemctl status apache2 --no-pager
sudo ss -lntp | grep -E ':80|:443'
sudo ufw status verbose
hostname -I
nslookup pcjoin.com

SSL 문제라면 추가로:

sudo certbot certificates
sudo tail -100 /var/log/apache2/error.log

이 결과들만 있으면 대부분의 Apache·VirtualHost·SSL·방화벽 문제를 빠르게 구분할 수 있습니다.


완성 구조

최종적으로 요청은 다음 경로로 들어옵니다.

인터넷 사용자
      │
      ▼
pcjoin.com DNS
      │
      ▼
서버 공인 IP
      │
      ▼
공유기
80 / 443 포트포워딩
      │
      ▼
Ubuntu
192.168.0.100
      │
      ▼
UFW
      │
      ▼
Apache VirtualHost
      │
      ▼
/var/www/html/pcjoin/g5
      │
      ▼
PHP
      │
      ▼
MySQL

HTTPS 요청은:

사용자
 ↓
https://pcjoin.com
 ↓
443
 ↓
Apache SSL VirtualHost
 ↓
Let's Encrypt 인증서
 ↓
웹사이트

구조로 처리됩니다.


댓글목록



등록된 댓글이 없습니다.

댓글쓰기

내용
자동등록방지 숫자를 순서대로 입력하세요.