웹사이트 검색

Fedora 34/CentOS 8에서 PHP로 캐디 웹 서버를 설치 및 구성하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - 캐디 설치
  4. 3단계 - 캐디 구성 기본 사항\n
    1. 기본 HTML 웹사이트용 캐디 구성
    2. Caddy에서 여러 사이트 구성
    3. PHP 사이트 구성
    4. 역방향 프록시 구성\n

    1. HTTP 인증 사용
    2. 사이트 보안 강화 및 HSTS 활성화\n

    Caddy는 Go 언어로 작성된 오픈 소스 웹 서버입니다. HTTP/3 지원, TLS v1.3, Lets Encrypt를 사용한 자동 SSL 구성, 역방향 프록시를 제공하고 기능을 확장하기 위한 여러 플러그인을 지원합니다. 호스팅해야 하는 사이트 수에 관계없이 모든 구성이 단일 파일에서 제공된다는 이점이 있습니다.

    이 튜토리얼에서는 Fedora 34 및 CentOS 8 기반 서버에서 Caddy 및 PHP를 설치하고 구성하는 방법을 다룹니다. 단일 및 다중 사이트를 호스팅하는 방법과 몇 가지 다른 보안 기능과 함께 리버스 프록시를 사용하는 방법을 다룰 것입니다.

    전제 조건

    • Fedora 34 or CentOS 8 based server

    • A non-root user with sudo privileges

    • A domain name pointing to the server IP address

    • SELinux is disabled.

      $ sudo setenforce 0
      
    • Make sure everything is updated.

      $ sudo dnf update
      

    1단계 - 방화벽 구성

    첫 번째 단계는 HTTP 및 HTTPS 포트를 열도록 방화벽을 구성하는 것입니다. Fedora 및 CentOS에는 Firewalld 방화벽이 미리 설치되어 있습니다.

    방화벽이 실행 중인지 확인하십시오.

    $ sudo firewall-cmd --state
    

    다음 출력을 얻어야 합니다.

    running
    

    현재 허용된 서비스/포트를 확인하십시오.

    $ sudo firewall-cmd --permanent --list-services
    

    다음 출력이 표시되어야 합니다.

    dhcpv6-client mdns ssh
    

    HTTP 및 HTTPS 포트를 허용합니다.

    $ sudo firewall-cmd --permanent --add-service=http
    $ sudo firewall-cmd --permanent --add-service=https
    

    방화벽의 상태를 다시 확인하십시오.

    $ sudo firewall-cmd --permanent --list-services
    

    비슷한 출력이 표시되어야 합니다.

    dhcpv6-client http https mdns ssh
    

    방화벽을 다시 로드합니다.

    $ sudo systemctl reload firewalld
    

    2단계 - 캐디 설치

    첫 번째 단계는 서버를 설치하는 것입니다. 설치 단계는 Fedora 34와 CentOS 8 모두 동일하게 유지됩니다.

    $ sudo dnf install 'dnf-command(copr)'
    $ sudo dnf copr enable @caddy/caddy
    $ sudo dnf install caddy
    

    다음 명령으로 설치를 확인할 수 있습니다.

    $ caddy version
    v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
    

    3단계 - 캐디 구성 기본 사항

    캐디는 구성을 저장하거나 작성하기 위한 기본 형식으로 JSON을 사용합니다. 구성을 작성하는 가장 유연한 방법이며 모든 Caddy 기능을 지원합니다. 하지만 JSON 파일을 작성하는 방법을 모른다면 Caddy는 Caddyfile 형식으로 더 쉬운 방법을 제공합니다.

    Fedora/CentOS 패키지에는 /etc/caddy/Caddyfile에 Caddyfile이 포함되어 있습니다. 다음과 같아야 합니다(주석 무시).

    :80 {
            root * /usr/share/caddy
            file_server
    }
    

    캐디 데몬을 활성화하고 시작합니다.

    $ sudo systemctl enable --now caddy
    

    URL http://youripaddress를 열어 확인할 수 있습니다. 다음 시작 페이지가 표시되어야 합니다.

    Caddy는 많은 기능과 구성을 제공하므로 중요한 기능만 사용하여 웹 사이트를 제공합니다. 기본 구성은 HTTP를 통해 제공되며 :80로 지정됩니다. root 지시어는 Caddy에게 /usr/share/caddy 디렉토리에서 제공할 파일을 찾도록 지시합니다.

    file_server 지시어는 Caddy에게 기본 주소를 통해 정적 파일만 제공한다는 의미인 파일 서버 역할을 하도록 지시합니다.

    기본 HTML 웹사이트용 캐디 구성

    정적 웹 사이트를 제공하기 위한 기본 캐디 구성 파일을 생성해 보겠습니다.

    웹 사이트를 호스팅하고 로그 파일을 저장할 디렉토리를 만듭니다.

    $ sudo mkdir -p /var/www/example.com/html
    $ sudo mkdir /var/log/caddy
    

    디렉터리의 소유권을 Caddy로 설정합니다.

    $ sudo chown caddy:caddy /var/www/example.com/html -R
    $ sudo chown caddy:caddy /var/log/caddy
    

    테스트할 HTML 파일을 만들고 편집을 위해 엽니다.

    $ sudo nano /var/www/example.com/html/index.html
    

    다음 코드를 추가합니다.

    <!DOCTYPE html>
    <html>
    <head>
    <title>Hello from Caddy!</title>
    </head>
    <body>
    <h1>Hello, from Caddy!</h1>
    </body>
    </html>
    

    Ctrl + X를 눌러 편집기를 닫고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

    편집을 위해 캐디 파일을 엽니다.

    $ sudo nano /etc/caddy/Caddyfile
    

    기존 코드를 다음으로 바꿉니다.

    example.com {
        root * /var/www/example.com/html
        file_server
        encode gzip
    
        log {
            output file /var/log/caddy/example.access.log
        }
    
        @static {
            file
            path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp
        }
        header @static Cache-Control max-age=5184000
    
        tls 
    }
    

    Ctrl + X를 눌러 편집기를 닫고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

    파일의 모든 지시문을 살펴보겠습니다. encode gzip 지시문은 Caddy에게 Gzip 압축을 사용하여 파일을 압축하도록 지시합니다.

    log 지시문은 사이트에 대한 액세스 로그를 /var/log/caddy/example.access.log 파일에 출력합니다. 기본적으로 캐디는 로그 파일이 100MB에 도달하면 회전합니다. 순환된 파일은 90일이 경과하거나 순환된 로그가 10개 이상일 때 삭제됩니다. 다음과 같은 방법으로 기본 매개변수를 변경할 수 있습니다.

    log {
        output file /var/log/caddy/example.access.log {
            roll_size 10MB
            roll_keep 5
            roll_keep_for 240h
        }
    }
    

    위의 코드에서 회전 로그 파일은 10MB로 제한되며 10일(240시간) 또는 회전 로그가 5개 이상일 때 삭제됩니다.

    캐디는 개입 없이 자동으로 SSL 인증서를 생성하고 설치합니다. tls 지시문을 사용하면 Lets Encrypt 보고서를 얻는 데 사용되는 이메일 주소와 같이 HTTPS를 구성하는 추가 옵션을 제공할 수 있습니다.

    header 지시문은 모든 정적 파일(이미지/javascript/CSS 파일)에서 캐시 제어를 활성화합니다. 더 많은 파일 확장자를 추가하거나 코드를 복사하여 다른 파일 형식에 대해 다른 기간을 설정할 수 있습니다. static 값은 명명된 참조이므로 다른 값으로 변경해야 합니다.

    완료되면 다음 명령을 사용하여 구성을 검증할 수 있습니다.

    $ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
    

    기본적으로 이 명령은 JSON 구성의 유효성만 검사하기 때문에 --adapter caddyfile 옵션을 사용해야 합니다.

    아래와 같은 경고가 뜨면 명령어 하나로 쉽게 고칠 수 있습니다.

    WARN    input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
    

    다음 명령을 실행하여 오류를 수정하십시오.

    $ caddy fmt --overwrite /etc/caddy/Caddyfile
    

    위의 명령은 Caddyfile을 포맷하고 덮어씁니다.

    구성을 활성화하려면 캐디를 다시 시작하십시오. 구성을 변경할 때마다 서버를 다시 시작해야 합니다.

    $ sudo systemctl restart caddy
    

    브라우저에서 열면 구성이 작동 중임을 의미하는 다음 페이지가 표시됩니다.

    캐디에서 여러 사이트 구성

    단일 캐디 파일에서 여러 사이트를 구성할 수 있습니다. 그렇게 하려면 다음과 같은 방법으로 각 사이트에 대해 별도의 블록을 만드십시오.

    example1.com {
    	root * /var/www/example1.com/html
    	...
    }
    
    example2.com {
    	root * /var/www/example2.com/html
    	...
    }
    

    이 방법은 몇 개의 사이트에는 적합하지만 여러 사이트를 호스팅하는 경우 단일 사이트가 상당히 커지고 유지 관리하기 어려울 수 있습니다.

    \/etc/caddy/caddyconf 디렉토리를 만듭니다.

    $ sudo mkdir /etc/caddy/caddyconf
    

    이제 파일 맨 위에 있는 /etc/caddty/caddyfile의 디렉토리에서 구성 파일을 가져올 수 있습니다.

    import caddyconf/*.conf
    

    마지막 단계는 각 사이트에 대한 개별 구성 파일을 만드는 것입니다.

    PHP 사이트 구성

    지금까지는 캐디를 사용하여 정적 사이트를 제공하는 것에 대해서만 이야기했습니다. Caddy를 사용하여 동적 PHP 사이트를 쉽게 제공할 수도 있습니다. PHP 지원을 활성화하려면 사이트 블록 내에 다음 코드를 추가하십시오.

    example1.com {
    	root * /var/www/example1.com/html
    	...
    	php_fastcgi unix//run/php-fpm/www.sock
    }
    

    PHP도 설치해야 합니다.

    $ sudo dnf install php-fpm php-cli php-gd
    

    필요한 추가 PHP 모듈을 설치할 수 있습니다. 또한 /etc/php-fpm.d/www.conf 파일을 구성해야 합니다. 편집할 파일을 엽니다.

    $ sudo nano /etc/php-fpm.d/www.conf
    

    PHP 프로세스의 Unix 사용자/그룹을 caddy로 설정해야 합니다. 파일에서 user=apachegroup=apache 줄을 찾아 nginx로 변경합니다.

    ...
    ; Unix user/group of processes
    ; Note: The user is mandatory. If the group is not set, the default user's group
    ;       will be used.
    ; RPM: apache user chosen to provide access to the same directories as httpd
    user = caddy
    ; RPM: Keep a group allowed to write in log dir.
    group = caddy
    ...
    

    listen.acl_users = apache,nginx 줄을 찾아 값을 다음과 같이 변경합니다.

    ...
    listen.acl_users = apache,nginx,caddy
    ...
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    PHP-fpm 프로세스를 시작합니다.

    $ sudo systemctl start php-fpm
    

    PHP 설정을 테스트하려면 html 폴더에 test.php 파일을 만듭니다.

    $ sudo nano /var/www/example.com/html/test.php
    

    다음 콘텐츠를 추가하고 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    <?php phpinfo();
    

    웹 브라우저에서 http://example.com/test.php를 실행하면 다음이 표시되어야 합니다.

    리버스 프록시 구성

    캐디는 리버스 프록시 서버로도 사용할 수 있습니다. 설정하려면 다음 코드를 사용하십시오.

    example1.com {
    	...
    	reverse_proxy localhost:8000 {
    		header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
    	}
    }
    

    4단계 - 캐디 글로벌 옵션

    Caddyfile을 사용하면 전 세계적으로 적용할 수 있는 몇 가지 옵션을 설정할 수 있습니다. 즉, 모든 사이트에 적용됩니다. 모든 서버 블록에서 전역 옵션을 다시 선언할 필요가 없도록 전역 옵션을 정의하는 것이 좋습니다.

    Caddyfile 맨 위에 전역 옵션을 포함해야 합니다. 전역으로 설정할 수 있는 많은 옵션이 있습니다. 몇 가지 중요한 사항만 살펴보겠습니다. 나머지는 캐디 문서를 참조해야 합니다.

    다음은 Caddyfile에서 사용할 수 있는 몇 가지 기본 옵션입니다.

    {	
    	#TLS Options
    	email 
    
    	servers	:443 {
    		protocol {
    			experimental_http3
    		}
    		max_header_size 5mb
    	}
    	
    	servers :80 {
    		protocol {
    			allow_h2c
    		}
    		max_header_size 5mb
    	}
    }
    

    위의 코드에서 email은 SSL 인증서를 Lets Encrypt 권한으로 등록하는 데 사용되는 이메일 ID를 지정합니다. OCSP 스테이플링은 인증서 해지 정보를 브라우저에 자동으로 제공하여 HTTPS 사이트의 성능을 향상시킵니다. max_header_size 옵션은 구문 분석할 클라이언트 HTTP 요청 헤더의 크기를 지정합니다.

    또한 HTTPS 사이트용 HTTP/3 프로토콜과 HTTP 사이트용 HTTP/2 지원을 활성화했습니다. 이는 실험적 기능이며 아마도 결국 제거될 것이므로 활성화하기 전에 주의하십시오.

    5단계 - 보안 강화

    HTTP 인증 활성화

    특정 디렉터리에 대해 단순 HTTP 인증을 활성화할 수 있습니다. 먼저 인증 자격 증명을 만들어야 합니다.

    캐디는 구성에서 해시된 암호만 허용합니다. 따라서 먼저 해시된 비밀번호를 생성해야 합니다. 그렇게 하려면 다음 명령을 실행하십시오.

    $ caddy hash-password
    Enter password:
    Confirm password:
    JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
    

    비밀번호가 준비되면 캐디 파일에 다음 코드를 입력하십시오.

    basicauth /secret/* {
    	John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
    }
    

    위의 명령은 방금 만든 자격 증명으로 /secret 디렉터리를 보호합니다.

    사이트 보안 강화 및 HSTS 활성화

    사이트를 보호하기 위해 추가할 수 있는 다른 보안 구성이 있습니다. 이를 위해 다른 파일 /etc/caddy/caddy_security.conf를 생성합니다.

    $ sudo nano /etc/caddy/caddy_security.conf
    

    다음 코드를 추가합니다.

    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Xss-Protection "1; mode=block"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
        Permissions-Policy "interest-cohort=()"
        Content-Security-Policy "upgrade-insecure-requests"
        Referrer-Policy "strict-origin-when-cross-origin"
        Cache-Control "public, max-age=15, must-revalidate"
        Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'"
    }
    

    위의 코드는 다음을 활성화/구현합니다.

    <시작>

  5. 사이트 및 모든 하위 도메인에 대한 HSTS 지원을 활성화합니다.\n
  6. XSS 필터링을 활성화합니다.\n
  7. 콘텐츠/MIME 스니핑을 방지합니다.\n
  8. 사이트가 IFRAME 내부에 로드되는 것을 방지합니다.\n
  9. 귀하의 사이트가 FLOC 추적 시험에 포함되는 것을 방지합니다.\n
  10. 사용자 에이전트가 안전하지 않은 URL을 처리하는 방법에 대한 콘텐츠 보안 정책을 추가합니다.\n
  11. 프로토콜이 동일한 경우 출처 간 요청에 대해 리퍼러만 전송되도록 리퍼러 정책을 구현합니다.\n
  12. 기능 정책은 특정 브라우저 기능을 활성화 및 비활성화하는 메커니즘을 제공합니다.\n

그런 다음 원하는 사이트 블록에서 파일을 가져옵니다.

example.com {
	...
	import /etc/caddy/caddy_security.conf
}

변경 사항을 구현하려면 서버를 다시 시작하십시오.

결론

이것으로 Fedora 34/CentOS 8 기반 서버에 Caddy 웹 서버를 설치하고 구성하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.