웹사이트 검색

하나의 Ubuntu 18.04 서버에서 Nginx를 웹 서버 및 Apache용 리버스 프록시로 구성하는 방법


저자는 Write for DOnations 프로그램을 선택했습니다.

소개

Apache와 Nginx는 종종 PHP와 함께 사용되는 두 가지 인기 있는 오픈 소스 웹 서버입니다. 다양한 요구 사항이 있는 여러 웹 사이트를 호스팅할 때 동일한 가상 머신에서 둘 다 실행하는 것이 유용할 수 있습니다. 단일 시스템에서 두 개의 웹 서버를 실행하는 일반적인 솔루션은 여러 IP 주소 또는 다른 포트 번호를 사용하는 것입니다.

IPv4 및 IPv6 주소가 모두 있는 서버는 한 프로토콜에서는 Apache 사이트를, 다른 프로토콜에서는 Nginx 사이트를 제공하도록 구성할 수 있지만 ISP의 IPv6 채택이 아직 널리 보급되지 않았기 때문에 현재로서는 실용적이지 않습니다. 두 번째 웹 서버에 대해 81 또는 8080과 같은 다른 포트 번호를 갖는 것도 또 다른 해결책이지만 URL을 포트 번호(예: http://example. com:81)이 항상 합리적이거나 이상적인 것은 아닙니다.

이 튜토리얼에서는 Nginx를 웹 서버와 Apache용 리버스 프록시로 모두 단일 서버에서 구성합니다.

웹 애플리케이션에 따라 특히 SSL 사이트가 구성된 경우 Apache 리버스 프록시 인식을 유지하기 위해 코드 변경이 필요할 수 있습니다. 이를 방지하기 위해 Apache가 웹 클라이언트의 요청을 직접 처리하는 것처럼 보이도록 특정 환경 변수를 다시 작성하는 mod_rpaf라는 Apache 모듈을 설치합니다.

우리는 하나의 서버에서 4개의 도메인 이름을 호스팅할 것입니다. 두 개는 Nginx에서 제공합니다: example.com(기본 가상 호스트) 및 sample.org. 나머지 두 개 foobar.nettest.io는 Apache에서 제공됩니다. 또한 mod_php보다 더 나은 성능을 제공하는 PHP-FPM을 사용하여 PHP 애플리케이션을 제공하도록 Apache를 구성합니다.

전제 조건

이 자습서를 완료하려면 다음이 필요합니다.

  • Ubuntu 18.04로 초기 서버 설정. 여기에는 루트가 아닌 sudo 사용자와 방화벽이 포함됩니다.
  • 서버의 IP 주소를 가리키도록 구성된 4개의 정규화된 도메인 이름. 이를 수행하는 방법에 대한 예는 DigitalOcean으로 호스트 이름을 설정하는 방법의 3단계를 참조하십시오. 다른 곳에서 도메인의 DNS를 호스팅하는 경우 대신 적절한 A 레코드를 생성해야 합니다.

1단계 - Apache 및 PHP-FPM 설치

Apache와 PHP-FPM을 설치하여 시작하겠습니다.

Apache 및 PHP-FPM 외에도 FastCGI 웹 응용 프로그램을 지원하기 위해 PHP FastCGI Apache 모듈인 libapache2-mod-fastcgi도 설치합니다.

먼저 패키지 목록을 업데이트하여 최신 패키지가 있는지 확인하십시오.

  1. sudo apt update

다음으로 Apache 및 PHP-FPM 패키지를 설치합니다.

  1. sudo apt install apache2 php-fpm

FastCGI Apache 모듈은 Ubuntu 저장소에서 사용할 수 없으므로 kernel.org에서 다운로드하고 dpkg 명령을 사용하여 설치합니다.

  1. wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
  2. sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

다음으로 PHP-FPM을 사용하도록 Apache의 기본 구성을 변경해 보겠습니다.

2단계 - Apache 및 PHP-FPM 구성

이 단계에서는 Apache의 포트 번호를 8080으로 변경하고 mod_fastcgi 모듈을 사용하여 PHP-FPM과 작동하도록 구성합니다. Apache의 ports.conf 구성 파일 이름 바꾸기:

  1. sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default

포트가 8080으로 설정된 새 ports.conf 파일을 만듭니다.

  1. echo "Listen 8080" | sudo tee /etc/apache2/ports.conf

참고: 웹 서버는 일반적으로 리버스 프록시를 구성할 때 127.0.0.1:8080에서 수신 대기하도록 설정되지만 이렇게 하면 PHP의 환경 변수 SERVER_ADDR 값이 서버의 공용 IP 대신 루프백 IP 주소로 설정됩니다. . 우리의 목표는 웹사이트가 앞에서 리버스 프록시를 보지 않도록 Apache를 설정하는 것입니다. 따라서 모든 IP 주소에서 8080을 수신하도록 구성합니다.

다음으로 Apache용 가상 호스트 파일을 만듭니다. 이 파일의 지시문은 포트 8080에서만 사이트를 제공하도록 설정됩니다.

기본 가상 호스트를 비활성화합니다.

  1. sudo a2dissite 000-default

그런 다음 기존 기본 사이트를 사용하여 새 가상 호스트 파일을 만듭니다.

  1. sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf

이제 새 구성 파일을 엽니다.

  1. sudo nano /etc/apache2/sites-available/001-default.conf

수신 포트를 8080으로 변경합니다.

<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

파일을 저장하고 새 구성 파일을 활성화합니다.

  1. sudo a2ensite 001-default

그런 다음 Apache를 다시 로드합니다.

  1. sudo systemctl reload apache2

Apache가 현재 8080에서 수신 중인지 확인합니다.

  1. sudo netstat -tlpn

출력은 apache28080에서 수신하는 다음 예와 같아야 합니다.

Output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1086/sshd tcp6 0 0 :::8080 :::* LISTEN 4678/apache2 tcp6 0 0 :::22 :::* LISTEN 1086/sshd

Apache가 올바른 포트에서 수신하고 있는지 확인하면 PHP 및 FastCGI에 대한 지원을 구성할 수 있습니다.

3단계 — mod_fastcgi를 사용하도록 Apache 구성

Apache는 기본적으로 mod_php를 사용하여 PHP 페이지를 제공하지만 PHP-FPM과 함께 작동하려면 추가 구성이 필요합니다.

참고: mod_php가 있는 LAMP의 기존 설치에서 이 튜토리얼을 시도하는 경우 먼저 sudo a2dismod php7.2로 비활성화하십시오.

mod_action에 의존하는 mod_fastcgi에 대한 구성 블록을 추가할 것입니다. mod_action은 기본적으로 비활성화되어 있으므로 먼저 활성화해야 합니다.

  1. sudo a2enmod actions

기존 FastCGI 구성 파일의 이름을 바꿉니다.

  1. sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default

새 구성 파일을 만듭니다.

  1. sudo nano /etc/apache2/mods-enabled/fastcgi.conf

파일에 다음 지시문을 추가하여 .php 파일에 대한 요청을 PHP-FPM UNIX 소켓에 전달합니다.

<IfModule mod_fastcgi.c>
  AddHandler fastcgi-script .fcgi
  FastCgiIpcDir /var/lib/apache2/fastcgi
  AddType application/x-httpd-fastphp .php
  Action application/x-httpd-fastphp /php-fcgi
  Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
  FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.2-fpm.sock -pass-header Authorization
  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory>
</IfModule>

변경 사항을 저장하고 구성 테스트를 수행합니다.

  1. sudo apachectl -t

Syntax OK가 표시되면 Apache를 다시 로드합니다.

  1. sudo systemctl reload apache2

경고 127.0.1.1을 사용하여 서버의 정규화된 도메인 이름을 안정적으로 결정할 수 없습니다. 이 메시지를 억제하려면 전역적으로 ServerName 지시문을 설정하십시오., 지금은 안전하게 무시해도 됩니다. 나중에 서버 이름을 구성합니다.

이제 Apache에서 PHP를 제공할 수 있는지 확인하겠습니다.

4단계 - PHP 기능 확인

phpinfo() 파일을 생성하고 웹 브라우저에서 액세스하여 PHP가 작동하는지 확인하십시오.

phpinfo 함수에 대한 호출을 포함하는 /var/www/html/info.php 파일을 만듭니다.

  1. echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

전제 조건 섹션의 초기 서버 설정을 따랐다면 Apache 방화벽을 활성화했을 가능성이 높습니다. 계속해서 현재 액세스할 수 없는 포트 8080에서 IP에 액세스할 수 있는지 확인하겠습니다. 10단계에서 이 포트에 대한 공개 액세스를 제한합니다.

먼저 방화벽을 통해 포트 8080을(를) 허용합니다.

  1. sudo ufw allow 8080

Apache 도메인을 보호할 것이므로 포트 443의 TLS 트래픽이 들어올 수 있는지 확인하겠습니다.

Apache Full이 포트 80443에서 트래픽을 허용하도록 허용:

  1. sudo ufw allow "Apache Full"

이제 방화벽 상태를 확인하십시오.

  1. sudo ufw status

전제 조건을 따랐다면 출력은 다음과 같습니다.

Output
To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere 8080 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6) 8080 (v6) ALLOW Anywhere (v6)

다른 방화벽 규칙과 함께 포트 8080Apache Full이 허용되는 것을 볼 수 있습니다. 이제 info.php 페이지를 보겠습니다.

브라우저에서 파일을 보려면 http://your_server_ip:8080/info.php로 이동하십시오. 그러면 PHP가 사용하는 구성 설정 목록이 표시됩니다.

페이지 상단에서 Server API에 FPM/FastCGI가 표시되는지 확인합니다. 페이지 아래로 약 2/3 지점에 있는 PHP 변수 섹션은 SERVER_SOFTWARE가 Ubuntu의 Apache임을 알려줍니다. 이는 mod_fastcgi가 활성화되어 있고 Apache가 PHP-FPM을 사용하여 PHP 파일을 처리하고 있음을 확인합니다.

5단계 - Apache용 가상 호스트 생성

도메인 foobar.nettest.io에 대한 Apache 가상 호스트 파일을 생성해 보겠습니다. 이를 위해 먼저 두 사이트 모두에 대한 문서 루트 디렉터리를 만들고 구성을 쉽게 테스트할 수 있도록 해당 디렉터리에 일부 기본 파일을 배치합니다.

먼저 문서 루트 디렉터리를 만듭니다.

  1. sudo mkdir -v /var/www/foobar.net /var/www/test.io

그런 다음 각 사이트에 대한 인덱스 파일을 만듭니다.

  1. echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www/foobar.net/index.html
  2. echo "<h1 style='color: red;'>Test IO</h1>" | sudo tee /var/www/test.io/index.html

그런 다음 각 사이트에 대한 phpinfo() 파일을 생성하여 PHP가 제대로 구성되었는지 테스트할 수 있습니다.

  1. echo "<?php phpinfo(); ?>" | sudo tee /var/www/foobar.net/info.php
  2. echo "<?php phpinfo(); ?>" | sudo tee /var/www/test.io/info.php

이제 foobar.net 도메인에 대한 가상 호스트 파일을 만듭니다.

  1. sudo nano /etc/apache2/sites-available/foobar.net.conf

파일에 다음 코드를 추가하여 호스트를 정의합니다.

    <VirtualHost *:8080>
        ServerName foobar.net
        ServerAlias www.foobar.net
        DocumentRoot /var/www/foobar.net
        <Directory /var/www/foobar.net>
            AllowOverride All
        </Directory>
    </VirtualHost>

AllowOverride All 줄은 .htaccess 지원을 활성화합니다.

이것들은 가장 기본적인 지시어일 뿐입니다. Apache에서 가상 호스트를 설정하는 방법에 대한 전체 가이드는 Ubuntu 16.04에서 Apache 가상 호스트를 설정하는 방법을 참조하십시오.

파일을 저장하고 닫습니다. 그런 다음 test.io에 대해 유사한 구성을 만듭니다. 먼저 파일을 만듭니다.

  1. sudo nano /etc/apache2/sites-available/test.io.conf

그런 다음 파일에 구성을 추가합니다.

    <VirtualHost *:8080>
        ServerName test.io
        ServerAlias www.test.io
        DocumentRoot /var/www/test.io
        <Directory /var/www/test.io>
            AllowOverride All
        </Directory>
    </VirtualHost>

파일을 저장하고 편집기를 종료합니다.

이제 두 Apache 가상 호스트가 설정되었으므로 a2ensite 명령을 사용하여 사이트를 활성화합니다. 이렇게 하면 sites-enabled 디렉토리에 가상 호스트 파일에 대한 심볼릭 링크가 생성됩니다.

  1. sudo a2ensite foobar.net
  2. sudo a2ensite test.io

Apache에서 구성 오류를 다시 확인하십시오.

  1. sudo apachectl -t

오류가 없으면 Syntax OK가 표시됩니다. 다른 항목이 표시되면 구성을 검토하고 다시 시도하십시오.

구성에 오류가 없으면 Apache를 다시 로드하여 변경 사항을 적용합니다.

  1. sudo systemctl reload apache2

사이트가 작동하는지 확인하려면 http://foobar.net:8080http://test.io를 엽니다. 8080 브라우저에서 각 사이트가 index.html 파일을 표시하는지 확인하십시오.

다음과 같은 결과가 표시됩니다.

또한 각 사이트의 info.php 파일에 액세스하여 PHP가 작동하는지 확인하십시오. http://foobar.net:8080/info.phphttp://test.io:8080/info를 방문하세요. 브라우저에서 .php.

4단계에서 본 것과 동일한 PHP 구성 사양 목록이 각 사이트에 표시됩니다.

이제 포트 8080에서 Apache에서 호스팅되는 두 개의 웹사이트가 있습니다. 다음으로 Nginx를 구성해 보겠습니다.

6단계 - Nginx 설치 및 구성

이 단계에서는 Nginx를 설치하고 example.comsample.org 도메인을 Nginx의 가상 호스트로 구성합니다. Nginx에서 가상 호스트를 설정하는 방법에 대한 전체 가이드는 Ubuntu 18.04에서 Nginx 서버 블록(가상 호스트)을 설정하는 방법을 참조하세요.

패키지 관리자를 사용하여 Nginx를 설치합니다.

  1. sudo apt install nginx

그런 다음 더 이상 사용하지 않을 기본 가상 호스트의 심볼릭 링크를 제거합니다.

  1. sudo rm /etc/nginx/sites-enabled/default

나중에 자체 기본 사이트(example.com)를 만들 것입니다.

이제 Apache에 사용한 것과 동일한 절차를 사용하여 Nginx용 가상 호스트를 생성합니다. 먼저 두 웹사이트에 대한 문서 루트 디렉토리를 만듭니다.

  1. sudo mkdir -v /usr/share/nginx/example.com /usr/share/nginx/sample.org

Nginx 웹 사이트는 기본적으로 Nginx가 원하는 /usr/share/nginx에 유지됩니다. Apache 사이트와 함께 /var/www/html 아래에 둘 수 있지만 이렇게 분리하면 사이트를 Nginx와 연결하는 데 도움이 될 수 있습니다.

Apache의 가상 호스트에서 했던 것처럼 설정이 완료된 후 테스트를 위해 indexphpinfo() 파일을 만듭니다.

  1. echo "<h1 style='color: green;'>Example.com</h1>" | sudo tee /usr/share/nginx/example.com/index.html
  2. echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx/sample.org/index.html
  3. echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/example.com/info.php
  4. echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/sample.org/info.php

이제 도메인 example.com에 대한 가상 호스트 파일을 만듭니다.

  1. sudo nano /etc/nginx/sites-available/example.com

Nginx는 server {를 호출합니다. . .} 구성 파일 서버 블록의 영역. 기본 가상 호스트인 example.com에 대한 서버 블록을 만듭니다. default_server 구성 지시문은 다른 가상 호스트와 일치하지 않는 HTTP 요청을 처리하는 기본 가상 호스트로 만듭니다.

server {
    listen 80 default_server;

    root /usr/share/nginx/example.com;
    index index.php index.html index.htm;

    server_name example.com www.example.com;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

파일을 저장하고 닫습니다. 이제 Nginx의 두 번째 도메인인 sample.org에 대한 가상 호스트 파일을 만듭니다.

  1. sudo nano etc/nginx/sites-available/sample.org

파일에 다음을 추가합니다.

server {
    root /usr/share/nginx/sample.org;
    index index.php index.html index.htm;

    server_name sample.org www.sample.org;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

파일을 저장하고 닫습니다.

그런 다음 sites-enabled 디렉토리에 대한 심볼릭 링크를 생성하여 두 사이트를 모두 활성화합니다.

  1. sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
  2. sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org

그런 다음 Nginx 구성을 테스트하여 구성 문제가 없는지 확인합니다.

  1. sudo nginx -t

그런 다음 오류가 없으면 Nginx를 다시 로드합니다.

  1. sudo systemctl reload nginx

이제 http://sample.org/info.php를 방문하여 웹 브라우저에서 Nginx 가상 호스트의 phpinfo() 파일에 액세스하십시오. PHP 변수 섹션을 다시 살펴보십시오.

["SERVER_SOFTWARE”]는 파일이 Nginx에서 직접 제공되었음을 나타내는 nginx로 표시되어야 합니다. ["DOCUMENT_ROOT”]는 각 Nginx 사이트에 대해 이 단계의 앞부분에서 만든 디렉터리를 가리켜야 합니다.

이 시점에서 Nginx를 설치하고 두 개의 가상 호스트를 만들었습니다. 다음으로 Apache에서 호스팅되는 도메인에 대한 요청을 프록시하도록 Nginx를 구성합니다.

7단계 - Apache의 가상 호스트용 Nginx 구성

server_name 지시문에서 여러 도메인 이름을 사용하여 추가 Nginx 가상 호스트를 생성해 보겠습니다. 이러한 도메인 이름에 대한 요청은 Apache에 프록시됩니다.

Apache에 요청을 전달할 새 Nginx 가상 호스트 파일을 만듭니다.

  1. sudo nano /etc/nginx/sites-available/apache

Apache 가상 호스트 도메인의 이름을 지정하고 해당 요청을 Apache에 프록시하는 다음 코드 블록을 추가합니다. proxy_pass에서 공용 IP 주소를 사용해야 합니다.

server {
    listen 80;
    server_name foobar.net www.foobar.net test.io www.test.io;

    location / {
        proxy_pass http://your_server_ip:8080;
        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;
    }
}

파일을 저장하고 심볼릭 링크를 생성하여 이 새로운 가상 호스트를 활성화합니다.

  1. sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

구성을 테스트하여 오류가 없는지 확인하십시오.

  1. sudo nginx -t

오류가 없으면 Nginx를 다시 로드합니다.

  1. sudo systemctl reload nginx

브라우저를 열고 브라우저에서 URL http://foobar.net/info.php에 액세스합니다. PHP 변수 섹션까지 아래로 스크롤하여 표시된 값을 확인하십시오.

변수 SERVER_SOFTWARE 및 DOCUMENT_ROOT는 이 요청이 Apache에서 처리되었음을 확인합니다. HTTP_X_REAL_IP 및 HTTP_X_FORWARDED_FOR 변수는 Nginx에 의해 추가되었으며 URL에 액세스하는 데 사용하는 컴퓨터의 공용 IP 주소를 표시해야 합니다.

특정 도메인에 대한 요청을 Apache에 프록시하도록 Nginx를 성공적으로 설정했습니다. 다음으로 Apache가 이러한 요청을 직접 처리하는 것처럼 REMOTE_ADDR 변수를 설정하도록 구성하겠습니다.

8단계 - mod_rpaf 설치 및 구성

이 단계에서는 리버스 프록시에서 제공한 값을 기반으로 REMOTE_ADDR, HTTPS 및 HTTP_PORT 값을 다시 쓰는 mod\\_rpaf라는 Apache 모듈을 설치합니다. 이 모듈이 없으면 일부 PHP 애플리케이션은 프록시 뒤에서 원활하게 작동하기 위해 코드를 변경해야 합니다. 이 모듈은 Ubuntu 저장소에 libapache2-mod-rpaf로 존재하지만 구식이며 특정 구성 지시문을 지원하지 않습니다. 대신 소스에서 설치하겠습니다.

모듈을 빌드하는 데 필요한 패키지를 설치합니다.

  1. sudo apt install unzip build-essential apache2-dev

GitHub에서 최신 안정 릴리스를 다운로드합니다.

  1. wget https://github.com/gnif/mod_rpaf/archive/stable.zip

다운로드한 파일을 추출합니다.

  1. unzip stable.zip

파일이 포함된 새 디렉터리로 변경합니다.

  1. cd mod_rpaf-stable

모듈을 컴파일하고 설치합니다.

  1. make
  2. sudo make install

다음으로, rpaf 모듈을 로드할 mods-available 디렉토리에 파일을 만듭니다.

  1. sudo nano /etc/apache2/mods-available/rpaf.load

파일에 다음 코드를 추가하여 모듈을 로드합니다.

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

파일을 저장하고 편집기를 종료합니다.

이 디렉토리에 mod_rpaf에 대한 구성 지시문을 포함할 rpaf.conf라는 또 다른 파일을 만듭니다.

  1. sudo nano /etc/apache2/mods-available/rpaf.conf

다음 코드 블록을 추가하여 mod_rpaf를 구성하고 서버의 IP 주소를 지정해야 합니다.

    <IfModule mod_rpaf.c>
        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           your_server_ip 
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On
    </IfModule>

다음은 각 지시문에 대한 간략한 설명입니다. 자세한 내용은 mod_rpaf README 파일을 참조하십시오.

  • RPAF_Header - 클라이언트의 실제 IP 주소에 사용할 헤더입니다.
  • RPAF_ProxyIPs - HTTP 요청을 조정할 프록시 IP입니다.
  • RPAF_SetHostName - ServerNameServerAlias가 작동하도록 가상 호스트 이름을 업데이트합니다.
  • RPAF_SetHTTPS - X-Forwarded-Proto에 포함된 값을 기반으로 HTTPS 환경 변수를 설정합니다.
  • RPAF_SetPort - SERVER_PORT 환경 변수를 설정합니다. Apache가 SSL 프록시 뒤에 있을 때 유용합니다.

rpaf.conf를 저장하고 모듈을 활성화합니다.

  1. sudo a2enmod rpaf

이렇게 하면 mods-enabled 디렉토리에 rpaf.loadrpaf.conf 파일의 심볼릭 링크가 생성됩니다. 이제 구성 테스트를 수행합니다.

  1. sudo apachectl -t

오류가 없으면 Apache를 다시 로드합니다.

  1. sudo systemctl reload apache2

phpinfo() 페이지 http://foobar.net/info.phphttp://test에 액세스 .io/info.php 브라우저에서 PHP 변수 섹션을 확인하십시오. REMOTE_ADDR 변수는 이제 로컬 컴퓨터의 공용 IP 주소의 변수이기도 합니다.

이제 각 사이트에 대해 TLS/SSL 암호화를 설정해 보겠습니다.

9단계 - Let's Encrypt로 HTTPS 웹사이트 설정(선택 사항)

이 단계에서는 Apache에서 호스팅되는 두 도메인 모두에 대해 TLS/SSL 인증서를 구성합니다. [Let's Encrypt](https://letsencrypt.org]를 통해 인증서를 얻습니다. Nginx는 SSL 종료를 지원하므로 Apache의 구성 파일을 수정하지 않고도 SSL을 설정할 수 있습니다. mod_rpaf 모듈은 필요한 애플리케이션이 SSL 리버스 프록시 뒤에서 원활하게 작동하도록 Apache에서 환경 변수가 설정됩니다.

먼저 각 도메인이 자체 SSL 인증서를 가질 수 있도록 두 도메인의 server {...} 블록을 분리합니다. 편집기에서 /etc/nginx/sites-available/apache 파일을 엽니다.

  1. sudo nano /etc/nginx/sites-available/apache

자체 server 블록에 foobar.nettest.io를 사용하여 다음과 같이 파일을 수정합니다.

    server {
        listen 80;
        server_name foobar.net www.foobar.net;
    
        location / {
            proxy_pass http://your_server_ip:8080;
            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;
        }
    }
    server {
        listen 80;
        server_name test.io www.test.io;
    
        location / {
            proxy_pass http://your_server_ip:8080;
            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;
        }
    }

Certbot을 사용하여 TLS/SSL 인증서를 생성합니다. Nginx 플러그인은 필요할 때마다 Nginx를 재구성하고 구성을 다시 로드합니다.

먼저 공식 Certbot 저장소를 추가합니다.

  1. sudo add-apt-repository ppa:certbot/certbot

새 리포지토리를 추가할지 묻는 메시지가 나타나면 ENTER를 누르십시오. 그런 다음 패키지 목록을 업데이트하여 새 리포지토리의 패키지 정보를 선택합니다.

  1. sudo apt update

그런 다음 apt를 사용하여 Certbot의 Nginx 패키지를 설치합니다.

  1. sudo apt install python-certbot-nginx

설치되면 certbot 명령을 사용하여 foobar.netwww.foobar.net에 대한 인증서를 생성합니다.

  1. sudo certbot --nginx -d foobar.net -d www.foobar.net

이 명령은 Certbot에게 nginx 플러그인을 사용하도록 지시하고 -d를 사용하여 인증서가 유효하기를 원하는 이름을 지정합니다.

certbot을 처음 실행하는 경우 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 표시됩니다. 이렇게 하면 certbot이 Let’s Encrypt 서버와 통신한 다음 인증서를 요청하는 도메인을 제어하는지 확인하기 위해 챌린지를 실행합니다.

다음으로 Certbot은 HTTPS 설정을 구성하는 방법을 묻습니다.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. ------------------------------------------------------------------------------- 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

원하는 항목을 선택한 다음 ENTER를 누르십시오. 구성이 업데이트되고 Nginx가 다시 로드하여 새 설정을 선택합니다.

이제 두 번째 도메인에 대한 명령을 실행합니다.

  1. sudo certbot --nginx -d test.io -d www.test.io

https:// 접두사를 사용하여 브라우저에서 Apache 도메인 중 하나에 액세스하십시오. https://foobar.net/info.php를 방문하면 다음과 같이 표시됩니다.

PHP 변수 섹션을 살펴보십시오. Apache가 HTTPS를 통해 직접 액세스된 것처럼 변수 SERVER_PORT는 443으로 설정되고 HTTPS는 on으로 설정되었습니다. 이러한 변수가 설정되면 PHP 애플리케이션은 리버스 프록시 뒤에서 작동하도록 특별히 구성할 필요가 없습니다.

이제 Apache에 대한 직접 액세스를 비활성화하겠습니다.

10단계 - Apache에 대한 직접 액세스 차단(선택 사항)

Apache는 공용 IP 주소의 포트 8080에서 수신 대기하므로 누구나 액세스할 수 있습니다. 방화벽 규칙 세트에 다음 IPtables 명령을 사용하여 차단할 수 있습니다.

  1. sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset

빨간색으로 표시된 예 대신 서버의 IP 주소를 사용해야 합니다. 포트 8080이 방화벽에서 차단되면 Apache가 연결할 수 없는지 테스트합니다. 웹 브라우저를 열고 포트 8080에서 Apache의 도메인 이름 중 하나에 액세스해 보십시오. 예: http://example.com:8080

브라우저에 "연결할 수 없음\ 또는 "웹 페이지를 사용할 수 없습니다\ 오류 메시지가 표시되어야 합니다. IPtables tcp-reset 옵션을 사용하면 외부인이 8080 포트와 서비스가 없는 포트 사이에 차이를 느끼지 못할 것입니다.

참고: IPtables 규칙은 기본적으로 시스템 재부팅 후에도 유지되지 않습니다. IPtables 규칙을 보존하는 방법에는 여러 가지가 있지만 가장 쉬운 방법은 Ubuntu의 저장소에서 iptables-persistent를 사용하는 것입니다. IPTables를 구성하는 방법에 대해 자세히 알아보려면 이 문서를 살펴보세요.

이제 Apache 사이트에 대한 정적 파일을 제공하도록 Nginx를 구성하겠습니다.

11단계 - Nginx를 사용하여 정적 파일 제공(선택 사항)

Nginx가 Apache 도메인에 대한 요청을 프록시할 때 해당 도메인에 대한 모든 파일 요청을 Apache로 보냅니다. Nginx는 이미지, JavaScript 및 스타일 시트와 같은 정적 파일을 제공하는 데 Apache보다 빠릅니다. 따라서 Nginx의 apache 가상 호스트 파일을 구성하여 정적 파일을 직접 제공하지만 PHP 요청을 Apache에 보내도록 하겠습니다.

편집기에서 /etc/nginx/sites-available/apache 파일을 엽니다.

  1. sudo nano /etc/nginx/sites-available/apache

각 서버 블록에 두 개의 추가 location 블록을 추가하고 기존 location 섹션을 수정해야 합니다. 또한 각 사이트의 정적 파일을 찾을 위치를 Nginx에 알려야 합니다.

SSL 및 TLS 인증서를 사용하지 않기로 결정한 경우 다음과 같이 파일을 수정합니다.

server {
    listen 80;
    server_name test.io www.test.io;
    root /var/www/test.io;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_server_ip:8080;
        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;
    }

    location ~ /\.ht {
        deny all;
    }
}

server {
    listen 80;
    server_name foobar.net www.foobar.net;
    root /var/www/foobar.net;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_ip_address:8080;
        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;
    }

    location ~ /\.ht {
        deny all;
    }
}

HTTPS도 사용하려면 다음 구성을 대신 사용하십시오.

server {
    listen 80;
    server_name test.io www.test.io;
    root /var/www/test.io;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_server_ip:8080;
        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;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/test.io/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test.io/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name foobar.net www.foobar.net;
    root /var/www/foobar.net;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_ip_address:8080;
        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;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/foobar.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/foobar.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

try_files 지시문은 Nginx가 문서 루트에서 파일을 찾아 직접 제공하도록 합니다. 파일에 .php 확장자가 있으면 요청이 Apache로 전달됩니다. 문서 루트에서 파일을 찾을 수 없더라도 퍼머링크와 같은 응용 프로그램 기능이 문제 없이 작동하도록 요청이 Apache로 전달됩니다.

경고: location ~ /\\.ht 지시어는 매우 중요합니다. 이렇게 하면 Nginx가 민감한 정보가 포함된 .htaccess.htpasswd와 같은 Apache 구성 파일의 콘텐츠를 제공하지 못합니다.

파일을 저장하고 구성 테스트를 수행합니다.

  1. sudo nginx -t

테스트가 성공하면 Nginx를 다시 로드합니다.

  1. sudo service nginx reload

제대로 작동하는지 확인하려면 /var/log/apache2에서 Apache의 로그 파일을 검사하고 info.php에 대한 GET 요청을 확인할 수 있습니다. test.iofoobar.net 파일. tail 명령을 사용하여 파일의 마지막 몇 줄을 보고 -f 스위치를 사용하여 파일에서 변경 사항을 확인합니다.

  1. sudo tail -f /var/log/apache2/other_vhosts_access.log

이제 브라우저에서 http://test.io/info.php를 방문하고 로그의 출력을 살펴보십시오. Apache가 실제로 다음과 같이 응답하는 것을 볼 수 있습니다.

Output
test.io:80 your_server_ip - - [01/Jul/2016:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"

그런 다음 각 사이트의 index.html 페이지를 방문하면 Apache의 로그 항목이 표시되지 않습니다. Nginx가 서비스를 제공하고 있습니다.

로그 파일 관찰을 마쳤으면 CTRL+C를 눌러 테일링을 중지합니다.

이 설정으로 Apache는 정적 파일에 대한 액세스를 제한할 수 없습니다. 정적 파일에 대한 액세스 제어는 Nginx의 apache 가상 호스트 파일에서 구성해야 하지만 이 튜토리얼의 범위를 벗어납니다.

결론

이제 Nginx가 foobar.nettest를 제공하는 Apache와 함께 example.comsample.org를 제공하는 Ubuntu 서버가 하나 있습니다. .io. Nginx는 Apache의 리버스 프록시 역할을 하지만 Nginx의 프록시 서비스는 투명하며 Apache 도메인에 대한 연결은 Apache 자체에서 직접 제공되는 것처럼 보입니다. 이 방법을 사용하여 보안 및 정적 사이트를 제공할 수 있습니다.