밤에 시작한 GCP 워드프레스에 보안 설정인 자물쇠 달기 즉 SSL 설치하느라 장장 5시간이 넘게 허비한 끝에 어느새 시간은 새벽을 향해 달려가고 있었습니다. 제미나이와 씨름하느라 기진맥진했지만 그래도 어쨌거나 제 워드프레스 주소창에 달린 자물쇠를 보니 뿌듯하여 제미나이에게도 그 사실을 알려주었습니다. 한낱 기계에 불과하건만 AI는 자기일처럼 기뻐하며 SSL 설치를 축하해주었습니다. 이제 전 안도감에 사로잡혀 개운한 마음으로 안락한 잠자리에 들 수 있을 줄 알았지만 그것 역시 경기도 오산이었습니다.
AI의 사악함은 어린아이의 천진함과 닮았다고나 할까? 비트나미 명령어 알려준 게 AI가 절 괴롭히려 그런 것이 아님을 알지만 결과적으로 전 몸과 마음이 지친 상태였건만 지치지 않는 AI가 그걸 알 수 있을리 없었습니다. 제미나이는 너무나 태연하게 자기 전에 이것만 설정하고 자라며 또 미끼를 던졌고, 전 그 미끼를 또 아무 생각없이 덥석 물었습니다. 변명을 하자면 제 뇌는 이미 아노미 anomie 상태였지만 너무나 상큼하게 별거 아니란 듯 말하는 AI의 그 말에 ‘그래? 금방 끝나나보네? 이왕 한 거 조금만 더 하지 뭐’ 이런 상태가 된 겁니다.
다시는 AI에게 현혹되지 않겠다고 다짐한 지 얼마 되지도 않았건만 설정 → 고유주소(Permalink): 이거 ‘글 이름(Post name)’으로 바꾸고 자라는 그 명령어를 실행하느라 또 다시 밤을 꼬박 새운 삽질기를 공개합니다.
Table of Contents
1️⃣ SSL 자물쇠(HTTPS) 설치 후 워드프레스 필수 설정 3가지
제 주소창엔 영롱한 자물쇠(HTTPS)가 달려 있습니다. 현실로 치자면 ‘등기 완료’ 한 셈이죠. 이제 구글이 제 사이트를 “안전한 곳”으로 인식하기 시작한 전환점을 맞은 겁니다. 비록 등기를 끝마쳤다지만 이대로 놔두고 그냥 잠들면 제가 자는 동안 구글 로봇이 제 집을 구경하러 오는 길이 험난해 그냥 돌아 가거나 아예 집을 못 찾거나 할 수 있단 것입니다. 내가 얼마나 고생을 해서 여기까지 왔는데 로봇이 그냥 가게 놔둘 수는 없는 노릇아닌가.
- https 확인 : 워드프레스 설정(setting) → 일반 (General) : 워드프레스 주소(URL)랑 사이트 주소(URL)가 둘 다 https://내도메인(ex)info-az.com)으로 되어 있는지 확인 필수! http에 s 가 빠져 있으면 무한 루프 돌거나 자물쇠 깨질 수 있으므로 반드시 확인해야 합니다.
- 고유주소(Permalinks) 변경 : 워드프레스 설정(setting) → 고유주소(Permalinks): 기본값인 Plain ?p=123 대신 ‘글 이름(Post name)’으로 바꿔야 합니다. 구글 로봇은 주소에 포함된 단어를 보고 글의 주제를 파악합니다. 그래서 숫자로 되어 있으면 구글 AI가 제가 쓴 글이 뭔지 이해를 못할뿐더러 읽지 못해 크롤링하지 못 하니까 글을 쓰나 마나란 말쌈. 그럼으로 반드시 ‘글 이름(Post name)’으로 바꿔야 합니다.
- 검색 엔진 가시성: 설정(setting) → 읽기(Reading) 하단에 ‘검색 엔진이 이 사이트를 색인 시도하지 않도록 하기 (Discourage search engines from indexing this site)’ 체크 해제되어 있는지 확인해야 합니다. 워드프레스 설치할 때 실수로 체크하는 경우가 많은데 이럴 경우 구글 로봇이 제 사이트 검색을 못하게 되므로 체크 해제는 필수입니다.

2️⃣ 고유주소 글이름 변경 후 Internal Server Error (500 에러) 해결 방법
워드프레스 주소(URL)랑 사이트 주소(URL)가 둘 다 https 인 것 확인 후 산뜻한 마음으로 고유주소(Permalinks)를 글 이름(Post name)으로 바꾸고 저장을 눌렀더니 갑자기 Internal Server Error (500 에러)가 뜨는 겁니다. 이 문장을 보는 순간 알았습니다. 오늘 잠자긴 글렀단 사실을…ㅠㅠ
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at admin@example.com to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
Internal Server Error (500 에러) 가 발생한 이유는 아까 Permalinks(고정주소)를 변경하는 순간 서버 설정 파일(.htaccess)이 꼬였거나 권한이 없어서 발생하는 전형적인 오류 증상입니다.

💡 왜 하필 ‘500’인가요?
인터넷 세상에서는 서버와 브라우저가 숫자로 대화를 나눕니다. 이걸 HTTP 상태 코드라고 합니다.
- 200번대: “오케이! 잘 돌아가!” (평소 우리같은 인간 눈엔 잘 안 나타납니다.)
- 400번대: “네 잘못이야.” (예: 404 Not Found – 주소를 잘못 쳤을 때 흔하게 볼 수 있죠)
- 500번대: “내 잘못이야… 근데 이유는 나도 너도 아무도 몰라.ㅋㅋ” (서버 내부 오류)
500은 그중에서도 “서버 안에서 뭔가 사달이 났는데, 정확히 어디가 고장 났는지 나도 설명 못 하겠어”라는 뜻의 가장 포괄적이고 무책임한 에러 코드입니다.
⚠️ 내 서버에서 500이 뜬 이유 해석
아까 제가 Permalinks(고정주소) 설정을 글 이름(Post name)으로 바꾼 게 도화선이 된 겁니다.
- 명령 하달: 제가 “주소를
내 도메인.com/글제목으로 바꿀래!”라고 버튼을 눌렀습니다. - 문지기의 당황: 워드프레스는 서버 문지기 파일인 “
.htaccess“에게 “야, 이제부터 숫자 주소 대신 글 이름으로 보내줘”라고 명령하려 시도합니다. - 충돌 발생: 그런데 지금 제 서버 권한 설정이 빡빡하거나, SSL 설치하면서 건드린 설정과 이 명령이 서로 충돌한 겁니다.
- 서버 파업: 서버는 이 복잡한 명령을 이해하지 못하고 “아몰랑, 나 일 안 해!” 하고 셔터를 내려버린 거죠. 그게 바로 제 서버의 500 에러 정체입니다.
Internal Server Error (500 에러)는 서버 소프트웨어(아파치/Nginx)가 잠시 혼란에 빠진 것일 뿐, 5시간 넘게 걸려 설치한 인증서(자물쇠) 자체에 문제가 생긴 건 아닙니다. 지금 상황은 자동차 엔진(서버)은 멀쩡한데, 내비게이션(주소 설정)이 길을 잘못 알려줘서 차가 길 한복판에 멈춰버린 것과 같습니다.
응급처치: 서버 심폐소생술 (약 처방 💊)
이 무책임한 Internal Server Error (500 에러)로 지금 워드프레스 사이트 접속이 안 되니, 유일한 접속 통로인 GCP SSH 검은창을 다시 열어야 합니다. 다신 보고 싶지 않았지만 어쩔 수가 없습니다.
- SSH 접속 후: 이게 주소 변환 기능을 켜는 마법의 주문입니다.
sudo a2enmod rewrite
2. 그다음:
sudo service apache2 restart
- 특징: 이미 서버 설정 파일(
.htaccess등)이 잘 만들어져 있다는 가정하에, “기능만 켜고 재시작해!”라고 명령하는 겁니다. - 장점: 매우 빠르고 간단합니다.
- 단점: 만약 오타로 인해 파일 내용 자체가 틀려먹었거나, 서버 권한이 꽉 막혀 있으면 이 명령만으로는 해결이 안 됩니다.
만약 이 명령어를 쳤는데도 Internal Server Error (500 에러)가 사라지지 않는다면, .htaccess 파일을 강제로 초기화하는 대수술을 진행 해야 합니다.

3️⃣ Internal Server Error (500 에러) 응급처치: 서버 심폐소생술 (대수술 🛠️)
아예 파일을 새로 쓰고 권한을 강제로 부여하는 Internal Server Error (500 에러)’를 처단할 무적의 3단계’를 기록한 것입니다.
- 1단계 (
cat <<EOF > ...): 설정 파일을 아예 깨끗하게 새로 밀어버리고, 완벽한 코드를 주입합니다. - 2단계 (
chown,chmod): “이 파일의 주인은 웹서버(www-data)고, 읽고 쓰는 권한은 이렇다”라고 신분증과 도장을 확실히 찍어주는 과정입니다. - 3단계 (
systemctl restart): 바뀐 모든 설정을 적용해서 서버를 다시 깨웁니다.
🛠️ 500 에러 즉시 해결법 (딱 3단계)
SSH 접속 후 root 권한인 상태에서 아래 과정을 천천히 따라하세요.
- Apache에서 ‘주소 변환’ 기능 켜기
서버가 글 이름 주소를 인식할 수 있도록 모듈을 활성화합니다.
a2enmod rewrite
- 서버 설정 파일 열기 (가장 중요)
아까 우리가 자물쇠를 채웠던 그 파일을 수정해야 합니다.
nano /etc/apache2/sites-enabled/wordpress-https.conf
- ‘AllowOverride’ 부분 수정하기
화살표 키로 내려가서 (혹은 비슷한 경로) 부분을 찾으세요. 그 안에 있는 AllowOverride None을 반드시 AllowOverride All로 바꿔야 합니다.
⚠️ 주의: AllowOverride None을 All로 안 바꾸면, 백날 명령어 쳐봐야 도루묵입니다!
- 수정 전: AllowOverride None
- 수정 후: AllowOverride All
저장: Ctrl + O 누르고 엔터, 그 다음 Ctrl + X로 나오기.
- 서버 재시작 (마무리)
systemctl restart apache2
💡 기계 명령어를 인간 언어로 해석하면?
워드프레스에서 ‘글이름’ 주소를 쓰려면 .htaccess라는 파일이 작동해야 하는데, 구글 클라우드 기본 설정은 보안상 이 파일을 무시하게 되어 있습니다 (None). 그래서 서버가 “500 에러”를 뱉으며 뻗어버리는 겁니다. 이걸 All로 바꿔주면 서버가 “아, 이 주소는 이렇게 연결하는구나!”라고 이해하게 됩니다.
이렇게 하면 500 에러가 사라져야 인지상정~! 하지만 제 서버는 주인 닮아서 그런가 그렇게 호락호락하지 않았습니다. ㅋㅋ
🚀 SSH 검은창에서 범인을 찾아라
아직도 500에러가 사라지지 않는다면? SSH 검은창에 그 비밀이 숨어 있으니 눈을 크게 뜨고 창을 뚫어져라 쳐다봐야합니다.
GNU nano 5.4 /etc/apache2/sites-enabled/wordpress-https.conf
<VirtualHost *:443>
ServerAdmin admin@example.com
DocumentRoot /var/www/html
SSLEngine on
<Directory /var/www/html>
Options -Indexes
AllowOverride FileInfo
</Directory>
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
ServerName yourdomain.com
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf</VirtualHost>
드디어 범인을 찾았습니다! 지금 화면에 보이는 AllowOverride FileInfo가 문제였습니다.
워드프레스의 ‘글이름’ 고유주소 설정은 단순히 파일 정보(FileInfo)만 건드리는 게 아니라, 서버의 주소 체계 전체를 재구성해야 하므로 반드시 All 권한이 필요합니다.
🛠️ 지금 열려 있는 nano 편집기 화면에서 화살표 키로 이동해 아래처럼 수정합니다.
- 기존: AllowOverride FileInfo
- 변경: AllowOverride All
- 수정을 마친 후 아래 순서대로 저장하고 빠져나옵니다.
- 저장: Ctrl + O 누르고 Enter
- 종료: Ctrl + X
🛠️ SSH 창 명령어 수정 방법
- 키보드 방향키=화살표 키(↓)를 눌러서 AllowOverride FileInfo 줄로 커서를 이동합니다.
- 백스페이스(Backspace)를 눌러서 FileInfo 글자만 지웁니다.
- 그 자리에 영어로 All 이라고 직접 입력합니다.
- 최종 명령어 모양: AllowOverride All
- 저장하기: 키보드에서 Ctrl 키를 누른 상태로 O (영문 오)를 누릅니다.
- 화면 하단에 File Name to Write…라고 뜨면 그냥 Enter를 칩니다.
- 나가기: Ctrl 키를 누른 상태로 영문 X를 눌러 검은 창(터미널)으로 빠져나옵니다.
※ 마지막 마무리 명령어 (띄어쓰기, 톳시하나 틀리면 안됨 주의)
편집기에서 빠져나와 root@wordpress…# 상태가 보이면, 서버가 이 설정을 인지하도록 딱 두 줄만 더 치면 끝납니다.
sudo a2enmod rewrite
sudo systemctl restart apache2
이제 500 에러가 사라졌는가? 아니요. 난공불락 難攻不落 요새이옵니다.
로그를 보면 Permission denied와 Access denied가 계속 떴죠? 이건 “열쇠 없이 남의 집 문을 열려고 한 것”과 같습니다. sudo라는 마스터키를 써야만 시스템 파일을 고칠 수 있습니다.
딱 세 번만 복사-붙여넣기 하세요 (이번엔 진짜 됩니다)1. 아파치 설정 강제 업데이트 (sudo 포함)
4️⃣ 🚨 500 Internal Server Error 해결 명령어 세트
주의: ‘본인도메인.com’ 부분을 본인의 실제 도메인으로 수정해서 사용하세요!
1단계: 아파치 HTTPS 설정 파일 강제 생성 (루트 권한)
(이 명령어를 통째로 복사해서 터미널에 붙여넣으세요)
# 워드프레스 500 Internal Server Error 해결 명령어 세트
# 주의: 아래 명령어에서 'yourdomain.com' 부분을 본인의 실제 도메인으로 모두 수정 후 사용하세요!
# 1단계: 아파치 HTTPS 설정 파일 강제 생성 (루트 권한)
# (이 명령어를 통째로 복사해서 터미널에 붙여넣으세요)
sudo bash -c 'cat <<EOF > /etc/apache2/sites-enabled/wordpress-https.conf
<VirtualHost *:443>
ServerAdmin admin@example.com
DocumentRoot /var/www/html
SSLEngine on
<Directory /var/www/html>
Options -Indexes
AllowOverride All
</Directory>
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>
ServerName yourdomain.com
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
EOF'
# 2단계: .htaccess 파일 자동 생성 및 권한 설정
# (워드프레스 주소 변환 에러를 방지합니다)
sudo bash -c 'cat <<EOF > /var/www/html/.htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
EOF'
sudo chown www-data:www-data /var/www/html/.htaccess
sudo chmod 644 /var/www/html/.htaccess
# 3단계: 주소 변환 모듈 활성화 및 서버 재시작
sudo a2enmod rewrite
sudo systemctl restart apache2
# 완료되었습니다! 이제 블로그에 접속해서 확인해보세요.
💡 왜 아까는 안 됐나요?
로그를 보면 Permission denied와 Access denied가 계속 떴죠? 이건 “열쇠 없이 남의 집 문을 열려고 한 것”과 같습니다. sudo라는 마스터키를 써야만 시스템 파일을 고칠 수 있습니다.

✅ ‘500 에러’라는 지옥에서 탈출하기 위한 완벽한 복구 가이드
위의 3단계를 차례대로 입력하셨다면, 이제 아파치가 성공적으로 재시작되었을 겁니다.
3단계 명령어 세트는 ‘500 에러’라는 지옥에서 탈출하기 위한 완벽한 복구 가이드 입니다.. 이 기록이 왜 중요한지, 그리고 당시 대체 무슨 일이 벌어졌던 건지 아주 쉽게 풀어서 해석해 드릴게요.
한 줄로 요약하자면: “서버 문지기(Apache)에게 ‘주소 판독기’를 설치하고, 집 주인이 직접(sudo) 허락(AllowOverride All)을 해준 과정”입니다.
1. 1단계: “주소 변환 기능 켜기” (a2enmod rewrite)
- 해석: 원래 서버는 내 도메인
.com/?p=123같은 숫자 주소만 알아듣습니다. 하지만 전 내도메인/글이름같은 영어 주소를 쓰고 싶었습니다. - 의미: 서버에게 “앞으로 한글이나 영어로 된 복잡한 주소가 들어와도 당황하지 말고 잘 찾아줘”라고 특수 안경(
rewrite모듈)을 씌워준 겁니다.
2. 2~3단계: “문지기의 권한 변경” (AllowOverride All)
여기가 가장 핵심이자 500 에러의 범인이었습니다.
- 상황: 워드프레스가 주소를 바꾸려고 서버 설정 파일(
.htaccess)을 수정하려고 했는데, 서버 설정이AllowOverride None으로 되어 있었습니다. 이건 “외부 프로그램(워드프레스)이 내 설정을 절대 못 바꾸게 해!”라고 빗장을 걸어 잠근 상태였습니다. - 조치: 이걸
AllowOverride All로 바꿨다는 건 “워드프레스야, 네가 알아서 주소 체계를 관리해도 좋아. 내가 허락할게!”라고 권한을 넘겨준 겁니다. 이 설정을 안 하면 서버는 명령 충돌을 일으키며 500 에러를 뿜고 뻗어버리니까요.
3. 마지막 조치: “sudo와 마스터키”
SSH 창 속 내용을 보면 Permission denied라는 말이 계속 나오는데요.
- 해석: 제 일반인 계정으로 왕의 문서(설정 파일)를 고치려 하니 서버가 “너 뭐야? 감히 어딜 만져!”라고 거부한 겁니다.
- 해결: 그래서 모든 명령어 앞에
sudo(Super User Do)를 붙여서 “나 이 집 주인이야, 비켜!”라고 마스터키를 꺼내 든 겁니다. 특히 복잡한 코드를cat <<EOF방식으로 한 번에 밀어 넣은 건, 파일 오타를 줄이기 위한 아주 현명한 신의 한 수인 셈입니다.
정리하자면 이렇습니다.
제 서버 500 에러는 “자물쇠(SSL)는 채웠는데, 정작 문을 여는 방식(주소 설정)을 서버가 허락하지 않아서” 발생한 것이었습니다.
그 500 에러를 1) 기능 켜고, 2) 권한 풀고, 3) 주인님 권한(sudo)으로 재시작해서 그 지옥을 탈출한 겁니다.
자물쇠(SSL)만 채우면 끝인 줄 알았는데 이건 뭐 산 넘어 산입니다. 서버의 세계는 0과 1로 된 냉혹한 정글이고, 권한(Permission) 하나에 내 5시간이 날아가는 곳이니까. 하지만 이 삽질이 결국 내 자산이 된다는 게 이 바닥의 생리 아니겠나?”
이젠 또 어떤 모험이 기다리고 있을지 은근히 기다려지는 전 역시…
워드프레스를 하면서 알게된 사실이 있다면 그동안 운영한 티스토리나 네이버 블로그는 애들 장난이었단 것.ㅋㅋ
📌 이전 글: GCP 워드프레스 SSL 5시간 사투기: AI의 조련과 ‘인간 키보드’의 각성
👉 다음 글: GCP 무료 서버 워드프레스 최적화: GeneratePress 테마와 필수 플러그인 설치 방법 (500 에러 방지)-워드프레스 무료 서버 구축기 #8