웹사이트 검색

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


소개

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

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

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

하나의 Droplet에서 4개의 도메인 이름을 호스팅합니다. 두 개는 Nginx에서 제공합니다: example.com(기본 가상 호스트) 및 sample.org. 나머지 두 개 foobar.nettest.io는 Apache에서 제공됩니다.

전제 조건

  • 새로운 Ubuntu 16.04 Droplet.
  • sudo 권한이 있는 표준 사용자 계정. Ubuntu 16.04에서 초기 서버 설정의 2단계와 3단계에 따라 표준 계정을 설정할 수 있습니다.
  • 원하는 도메인 이름은 DigitalOcean 제어판에서 Droplet의 IP 주소를 가리켜야 합니다. 이를 수행하는 방법에 대한 예는 DigitalOcean으로 호스트 이름을 설정하는 방법의 3단계를 참조하십시오. 다른 곳에서 도메인의 DNS를 호스팅하는 경우 대신 적절한 A 레코드를 생성해야 합니다.

선택적 참조

이 자습서에는 Apache 및 Nginx의 가상 호스트와 SSL 인증서 생성 및 구성에 대한 기본 지식이 필요합니다. 이러한 항목에 대한 자세한 내용은 다음 문서를 참조하세요.

  • Apache에서 가상 호스트 설정
  • Nginx에서 가상 호스트 설정
  • Nginx로 하나의 IP에 여러 SSL 인증서 설정

1단계 - Apache 및 PHP-FPM 설치

Apache 및 PHP-FPM 외에도 libapache2-mod-fastcgi라는 PHP FastCGI Apache 모듈도 설치해야 합니다.

먼저 apt 저장소를 업데이트하여 최신 패키지가 있는지 확인하십시오.

  1. sudo apt-get update

다음으로 필요한 패키지를 설치합니다.

  1. sudo apt-get install apache2 libapache2-mod-fastcgi php-fpm

다음으로 Apache의 기본 구성을 변경해 보겠습니다.

2단계 - Apache 및 PHP-FPM 구성

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

  1. sudo nano /etc/apache2/ports.conf

다음 줄을 찾으십시오.

Listen 80

다음으로 변경:

Listen 8080

ports.conf를 저장하고 종료합니다.

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

다음으로 Apache의 기본 가상 호스트 파일을 편집합니다. 이 파일의 지시문은 포트 80에서만 사이트를 제공하도록 설정되었으므로 이 부분도 변경해야 합니다. 기본 가상 호스트 파일을 엽니다.

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

첫 번째 줄은 다음과 같아야 합니다.

<VirtualHost *:80>

다음으로 변경:

<VirtualHost *:8080>

파일을 저장하고 Apache를 다시 로드합니다.

  1. sudo systemctl reload apache2

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

  1. sudo netstat -tlpn

출력은 apache2가 :::8080에서 수신하는 다음 예제와 같아야 합니다.

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의 기존 설치에서 이 튜토리얼을 시도하는 경우 먼저 다음을 사용하여 비활성화하십시오.

  1. sudo a2dismod php7.0

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

  1. sudo a2enmod actions

이러한 구성 지시문은 .php 파일에 대한 요청을 PHP-FPM UNIX 소켓으로 전달합니다.

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

내에 다음 줄을 추가합니다. . . 블록, 해당 블록의 기존 항목 아래:

 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.0-fpm.sock -pass-header Authorization
 <Directory /usr/lib/cgi-bin>
    Require all granted
 </Directory>

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

  1. sudo apachectl -t

Syntax OK가 표시되면 Apache를 다시 로드합니다. 경고 127.0.1.1을 사용하여 서버의 정규화된 도메인 이름을 안정적으로 결정할 수 없습니다. 이 메시지를 표시하지 않도록 ServerName 지시문을 전체적으로 설정하십시오., 좋습니다. 지금은 우리에게 영향을 미치지 않습니다.

  1. sudo systemctl reload apache2

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

4단계 - PHP 기능 확인

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

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

브라우저에서 파일을 보려면 http://your_ip_address: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,test.io}

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

  1. echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www/foobar.net/index.html
  1. 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
  1. 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
  1. 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에서 호스팅되는 두 개의 웹사이트가 있습니다.

6단계 - Nginx 설치 및 구성

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

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

  1. sudo apt-get install nginx

그런 다음 더 이상 사용하지 않을 기본 가상 호스트의 심볼릭 링크를 제거합니다. 나중에 자체 기본 사이트(example.com)를 만들 것입니다.

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

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

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

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

  1. echo "<h1 style='color: green;'>Example.com</h1>" | sudo tee /usr/share/nginx/example.com/index.html
  1. echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx/sample.org/index.html
  1. echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/example.com/info.php
  1. 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 요청을 처리하는 기본 가상 호스트로 만듭니다.

example.com의 파일에 다음을 붙여넣습니다.

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.0-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

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

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

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.0-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
  1. sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org

Nginx 구성 테스트를 수행합니다.

  1. sudo nginx -t

그런 다음 OK가 표시되면 Nginx를 다시 로드합니다.

  1. sudo systemctl reload nginx

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

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

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

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

server_name 지시문에서 여러 도메인 이름을 사용하여 추가 Nginx 가상 호스트를 생성해 보겠습니다. 이러한 도메인 이름에 대한 요청은 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

OK가 표시되면 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-get 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
  1. 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

이 디렉터리에 다른 파일을 만듭니다. 여기에는 구성 지시문이 포함됩니다.

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

다음 코드 블록을 추가하여 Droplet의 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 - ServerName 및 ServerAlias가 작동하도록 가상 호스트 이름을 업데이트합니다.
  • 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

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

  1. sudo systemctl reload apache2

브라우저에서 Apache 웹사이트의 phpinfo() 페이지 중 하나에 액세스하고 PHP 변수 섹션을 확인하십시오. REMOTE_ADDR 변수는 이제 로컬 컴퓨터의 공용 IP 주소의 변수이기도 합니다.

9단계 - HTTPS 웹사이트 설정(선택 사항)

이 단계에서는 Apache에서 호스팅되는 두 도메인 모두에 대해 SSL 인증서를 구성합니다. Nginx는 SSL 종료를 지원하므로 Apache의 구성 파일을 수정하지 않고도 SSL을 설정할 수 있습니다. mod_rpaf 모듈은 애플리케이션이 SSL 리버스 프록시 뒤에서 원활하게 작동하도록 Apache에 필수 환경 변수가 설정되었는지 확인합니다.

SSL 인증서 및 해당 개인 키에 대한 디렉토리를 작성하십시오.

  1. sudo mkdir /etc/nginx/ssl

이 기사에서는 유효 기간이 10년인 자체 서명 SSL 인증서를 사용합니다. foobar.nettest.io 모두에 대해 자체 서명된 인증서를 생성합니다.

  1. sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/foobar.net-key.pem -out /etc/nginx/ssl/foobar.net-cert.pem -days 3650 -nodes
  1. sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/test.io-key.pem -out /etc/nginx/ssl/test.io-cert.pem -days 3650 -nodes

매번 인증서 식별 정보를 입력하라는 메시지가 표시됩니다. 매번 일반 이름에 적절한 도메인을 입력하십시오.

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:foobar.net
Email Address []:

이제 Nginx에서 Apache로 요청을 프록시하는 Apache 가상 호스트 파일을 엽니다.

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

도메인마다 별도의 인증서와 키가 있으므로 별도의 server { 가 필요합니다. . . } 각 도메인에 대한 블록. 파일의 현재 내용을 삭제하고 다음 내용으로 교체해야 합니다.

server {
    listen 80;
    listen 443 ssl;
    server_name test.io www.test.io;

    ssl on;
    ssl_certificate /etc/nginx/ssl/test.io-cert.pem;
    ssl_certificate_key /etc/nginx/ssl/test.io-key.pem;

    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;
    listen 443 ssl;
    server_name foobar.net www.foobar.net;

    ssl on;
    ssl_certificate /etc/nginx/ssl/foobar.net-cert.pem;
    ssl_certificate_key /etc/nginx/ssl/foobar.net-key.pem;

    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;
    }
}

우리는 원래 서버 블록을 두 개의 별도 블록으로 분리하고 Nginx에게 보안 사이트의 기본 포트인 포트 443에서 수신하도록 지시했습니다.

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

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx

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

이 자습서에서는 자체 서명된 인증서를 사용했기 때문에 브라우저에서 연결을 신뢰할 수 없다고 경고할 수 있습니다. 사이트를 신뢰하시면 안전하게 진행하실 수 있습니다.

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

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

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

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

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

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

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

먼저 apache 가상 호스트 파일을 엽니다.

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

각 서버 블록에 두 개의 추가 위치 블록을 추가하고 기존 위치 블록을 수정해야 합니다. (이전 단계의 서버 블록이 하나만 있는 경우 파일의 내용을 완전히 교체하여 아래 표시된 내용과 일치시킬 수 있습니다.) 또한 각 사이트에 대한 정적 파일을 찾을 위치를 Nginx에 알려야 합니다. . 이러한 변경 사항은 다음 코드에서 빨간색으로 표시됩니다.

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_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 ~ /\. {
        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 ~ /\. {
        deny all;
    }
}

HTTPS도 사용 가능하게 하려면 listen 443 ssl; 행과 9단계의 다른 SSL 설정을 유지하십시오.

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

경고: location ~ /\\. 지시문은 매우 중요합니다. 이렇게 하면 Nginx가 민감한 정보가 포함된 .htaccess.htpasswd와 같은 파일의 내용을 인쇄하지 못합니다.

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

  1. sudo nginx -t

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

  1. sudo service nginx reload

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

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

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

 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 Droplet이 하나 있습니다. .io. Nginx는 Apache의 리버스 프록시 역할을 하지만 Nginx의 프록시 서비스는 투명하며 Apache 도메인에 대한 연결은 Apache 자체에서 직접 제공되는 것처럼 보입니다. 이 방법을 사용하여 보안 및 정적 사이트를 제공할 수 있습니다.