프롤로그: 왜 텍스트 설정(Conf)인가?

지난 포스팅에서 Docker로 Nextcloud를 구축했습니다. 이제 외부 접속을 위해 웹 서버(Nginx)를 연결할 차례입니다.

Nginx Proxy Manager(NPM) 같은 GUI 도구는 편리하지만, 시스템 리소스를 추가로 소모하고 문제 발생 시 디버깅이 어렵습니다. 반면, 리눅스 표준 방식인 설정 파일(.conf)을 직접 관리하면 가볍고 유연하며, 서버의 동작 원리를 정확히 파악할 수 있습니다.

이 글에서는 우분투(Ubuntu) 환경에서 Native Nginx를 설치하고, 설정 파일을 작성하여 Docker 컨테이너와 연결한 뒤, Certbot으로 HTTPS를 적용하는 전체 과정을 상세히 기록합니다.


1단계: Nginx 설치 및 기본 구조

먼저 호스트 OS(우분투)에 Nginx를 설치합니다.

sudo apt update
sudo apt install nginx -y

Nginx 설정 파일의 핵심 경로

  • /etc/nginx/nginx.conf: Nginx 전체의 전역 설정 파일입니다.
  • /etc/nginx/sites-available/: 작성한 설정 파일을 보관하는 장소입니다.
  • /etc/nginx/sites-enabled/: 실제로 서버가 읽어들이는 장소입니다. (주로 available 폴더의 파일을 심볼릭 링크로 연결합니다.)

2단계: 리버스 프록시(Reverse Proxy) 설정

파일 작성외부 도메인(예: my-cloud.duckdns.org)으로 들어온 요청을 내부의 Nextcloud 컨테이너 포트(8080)로 전달해주는 설정을 작성합니다.

먼저 sites-available 폴더에 설정 파일을 생성합니다.

sudo nano /etc/nginx/sites-available/nextcloud.conf

아래 내용을 붙여넣습니다. (도메인과 포트는 본인 환경에 맞게 수정 필요)

server {
    # 1. 도메인 설정
    server_name my-cloud.duckdns.org; 

    # 2. 로그 경로 지정 (디버깅용)
    access_log /var/log/nginx/nextcloud_access.log;
    error_log  /var/log/nginx/nextcloud_error.log;

    # 3. 리버스 프록시 설정
    location / {
        # Docker 컨테이너가 떠 있는 내부 주소와 포트
        proxy_pass [http://127.0.0.1:8080](http://127.0.0.1:8080); 

        # 4. 헤더 전달 설정 (중요)
        # 클라이언트의 실제 IP와 정보를 Nextcloud에 전달해야 보안 로그가 정확히 남음
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 5. Nextcloud용 추가 헤더 (대용량 파일 업로드 시 필요할 수 있음)
        client_max_body_size 10G; # 업로드 제한 10GB로 증설
        proxy_buffering off;
    }
}

설정 활성화 (심볼릭 링크) 작성한 파일을 sites-enabled 폴더에 링크를 걸어 활성화합니다.

sudo ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/

문법 검사 및 재시작 설정에 오타가 없는지 확인하고 Nginx를 재시작합니다.

sudo nginx -t  # "syntax is ok"가 떠야 함
sudo systemctl reload nginx

3단계: Certbot을 이용한 SSL(HTTPS) 자동 적용

HTTP(80)로 접속하면 보안에 취약합니다. Certbot을 사용하면 무료 SSL 인증서(Let’s Encrypt)를 발급받고, Nginx 설정까지 자동으로 업데이트해줍니다.

Certbot 설치

sudo apt install certbot python3-certbot-nginx

인증서 발급 및 적용

sudo certbot --nginx -d my-cloud.duckdns.org

명령어를 실행하면 이메일 주소를 묻고, HTTP 접근을 HTTPS로 강제 리다이렉트(Redirect)할지 묻습니다. **Redirect(2번)**를 선택하는 것이 좋습니다.

설정이 완료되면 Certbot이 알아서 nextcloud.conf 파일 하단에 SSL 관련 코드를 추가해 줍니다. (# managed by Certbot 주석이 달린 부분)


4단계: 트러블슈팅 (Troubleshooting)

설정 후 접속이 안 될 때 체크해야 할 사항들입니다.

1. 502 Bad Gateway 에러

  • 원인: Nginx는 켜져 있는데, 연결하려는 뒷단의 Docker 컨테이너(127.0.0.1:8080)가 꺼져 있거나 응답하지 않는 경우입니다.
  • 해결: docker ps로 Nextcloud 컨테이너 상태를 확인하세요.

2. 403 Forbidden 에러

  • 원인: 권한 문제거나, index.html 등을 찾지 못하는 경우입니다.
  • 해결: Nextcloud의 경우 proxy_pass 설정이 정확한지 확인해야 합니다.

3. Nextcloud “신뢰할 수 없는 도메인” 에러

  • 원인: Nextcloud 내부 설정에 새 도메인이 등록되지 않아서 발생합니다.
  • 해결: Nextcloud 설정 파일(config/config.php)을 열어 trusted_domains 배열에 도메인을 추가해야 합니다.
'trusted_domains' => 
array (
  0 => 'localhost:8080',
  1 => 'my-cloud.duckdns.org', # 추가
),

마무리

이제 GUI 툴 없이도 터미널 상에서 웹 서버를 자유자재로 설정할 수 있게 되었습니다.

이 방식의 가장 큰 장점은 **“재현성”**입니다. 서버를 옮기거나 새로 구축할 때, 백업해 둔 .conf 텍스트 파일 하나만 있으면 1분 만에 동일한 환경을 복구할 수 있기 때문입니다.