웹사이트 검색

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

선택적 참조

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

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

1단계 - Apache 및 PHP5-FPM 설치

Apache 및 PHP-FPM 외에도 PHP FastCGI Apache 모듈도 설치해야 합니다. Ubuntu의 다중 저장소에서 사용할 수 있는 libapache2-mod-fastcgi입니다. 먼저 sources.list 파일에서 활성화해야 합니다.

sudo nano /etc/apt/sources.list

다음 줄을 찾아 시작 부분의 해시 기호(#)를 제거하여 주석 처리를 해제하십시오.

# deb http://mirrors.linux-console.net/ubuntu trusty multiverse

 . . .

# deb http://mirrors.linux-console.net/ubuntu trusty-updates multiverse

그러면 아래에 표시된 내용이 표시됩니다.

 deb http://mirrors.linux-console.net/ubuntu trusty multiverse

 . . .

 deb http://mirrors.linux-console.net/ubuntu trusty-updates multiverse

파일을 저장하고 apt 저장소를 업데이트합니다.

sudo apt-get update

그런 다음 필요한 패키지를 설치합니다.

sudo apt-get install apache2 libapache2-mod-fastcgi php5-fpm

2단계 - Apache 및 PHP5-FPM 구성

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

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에서만 사이트를 제공하도록 설정됩니다.

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

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

<VirtualHost *:80>

다음으로 변경:

<VirtualHost *:8080>

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

sudo service apache2 reload

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

sudo netstat -tlpn

출력은 :::8080에서 수신 대기 중인 apache2와 함께 아래와 같아야 합니다.

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

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

Apache는 기본적으로 mod_php와 함께 작동하지만 PHP5-FPM과 함께 작동하려면 추가 구성이 필요합니다.

참고: mod_php를 사용하여 LAMP의 기존 설치에서 이 튜토리얼을 시도하는 경우 먼저 다음을 사용하여 비활성화하십시오.

sudo a2dismod php5

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

sudo a2enmod actions

다음을 사용하여 Droplet에 설치된 Apache 버전을 확인하십시오.

sudo apache2 -v

그에 따라 fastcgi 구성 파일을 편집합니다. 이러한 구성 지시문은 .php 파일에 대한 요청을 PHP5-FPM UNIX 소켓으로 전달합니다.

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

의 맨 아래에 다음 줄을 추가합니다. . . Apache 2.4용 블록:

 AddType application/x-httpd-fastphp5 .php
 Action application/x-httpd-fastphp5 /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
 <Directory /usr/lib/cgi-bin>
  Require all granted
 </Directory>

Apache 2.2에는 섹션이 필요하지 않으므로 다음을 추가하십시오.

 AddType application/x-httpd-fastphp5 .php
 Action application/x-httpd-fastphp5 /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization

fastcgi.conf에서 완료되면 구성 테스트를 수행합니다.

sudo apachectl -t

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

sudo service apache2 reload

4단계 - PHP 기능 확인

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

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

브라우저에서 파일을 보려면 http://111.111.111.111:8080/info.php로 이동하되 Droplet의 IP 주소를 사용합니다. 그러면 PHP가 사용하는 구성 사양 목록이 표시됩니다.

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

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

도메인 foobar.nettest.io에 대해 두 개의 Apache 가상 호스트 파일을 생성합니다. 이것은 두 사이트 모두에 대한 문서 루트 디렉토리를 생성하는 것으로 시작됩니다.

sudo mkdir -v /var/www/{foobar.net,test.io}

이제 설정이 완료된 후 테스트를 위해 각 디렉토리에 두 개의 파일을 추가합니다.

먼저 각 사이트에 대한 인덱스 파일을 생성합니다.

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

그런 다음 phpinfo() 파일.

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

foobar.net 도메인에 대한 가상 호스트 파일을 생성합니다.

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

다음 지시문을 배치하십시오.

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

파일을 저장하고 닫습니다. 그런 다음 test.io에 대해 동일한 작업을 수행합니다.

sudo nano /etc/apache2/sites-available/test.io.conf
<VirtualHost *:*>
	ServerName test.io
	ServerAlias www.test.io
	DocumentRoot /var/www/test.io
	<Directory /var/www/test.io>
		AllowOverride All
	</Directory>
</VirtualHost>

참고 1: AllowOverride All.htaccess 지원을 활성화합니다.

참고 2: 이들은 가장 기본적인 지시어일 뿐입니다. Apache에서 가상 호스트를 설정하는 방법에 대한 전체 가이드는 Ubuntu 14.04 LTS에서 Apache 가상 호스트를 설정하는 방법을 참조하세요.

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

sudo a2ensite foobar.net
sudo a2ensite test.io

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

sudo apachectl -t

Syntax OK가 표시되면 다시 로드하십시오.

sudo service apache2 reload

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

넌 봐야 해:

또한 info.php 파일에 액세스하여 PHP가 작동하는지 확인하십시오. http://foobar.net:8080/info.phphttp:// test.io:8080/info.php.

1단계에서 본 것과 동일한 PHP 구성 사양 목록이 각 사이트에 표시되어야 합니다. 이제 포트 8080에서 Apache에서 호스팅되는 두 개의 웹사이트가 있습니다.

6단계 - Nginx 설치 및 구성

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

Nginx를 설치합니다.

sudo apt-get install nginx

그런 다음 기본 가상 호스트의 심볼릭 링크를 제거합니다.

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

이제 Nginx용 가상 호스트를 생성합니다. 먼저 두 웹사이트 모두에 대해 문서 루트 디렉토리를 만듭니다.

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

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

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

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

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$ {
		try_files $uri =404;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}
}

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

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$ {
		try_files $uri =404;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}
}

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

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

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

sudo service nginx configtest

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

sudo service nginx reload

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

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

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

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

이 섹션에서는 server_name 지시문에 여러 도메인 이름이 있는 추가 Nginx 가상 호스트를 생성합니다. 이러한 도메인 이름에 대한 요청은 Apache에 프록시됩니다.

새 Nginx 가상 호스트 파일을 만듭니다.

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://111.111.111.111: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;
	}
}

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

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

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

sudo service nginx configtest

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

sudo service nginx reload

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

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

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

8단계 - mod_rpaf 설치 및 구성

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

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

sudo apt-get install unzip build-essential apache2-threaded-dev

GitHub에서 최신 안정 릴리스를 다운로드하십시오.

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

다음을 사용하여 추출하십시오.

unzip stable.zip

작업 디렉토리로 변경하십시오.

cd mod_rpaf-stable

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

sudo make
sudo make install

rpaf 모듈을 로드하는 mods-available 디렉토리에 파일을 만듭니다.

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

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

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

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

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

다음 코드 블록을 추가하여 Droplet의 IP 주소를 추가하십시오.

<IfModule mod_rpaf.c>
        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           111.111.111.111
        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를 저장하고 모듈을 활성화합니다.

sudo a2enmod rpaf

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

sudo apachectl -t

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

sudo service apache2 reload

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

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

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

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

sudo mkdir /etc/nginx/ssl

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

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
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) []:example.com
Email Address []:

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

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

각 도메인에 대해 별도의 인증서와 키가 있으므로 별도의 server { 가 있어야 합니다. . . } 각 도메인에 대한 블록. 현재 콘텐츠를 삭제해야 하며 완료되면 apache vhost 파일이 아래와 유사하게 표시되어야 합니다.

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://111.111.111.111: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://111.111.111.111: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;
	}
}

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

sudo service nginx configtest

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

sudo service nginx reload

https:// 접두사가 있는 브라우저를 통해 Apache 도메인 중 하나에 액세스: https://foobar.net/info.php

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

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

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

sudo iptables -I INPUT -p tcp --dport 8080 ! -s 111.111.111.111 -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를 사용하는 것입니다.

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

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

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

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

아래 코드 블록에서 빨간색으로 표시된 것처럼 각 서버 블록에 두 개의 추가 location 블록을 추가합니다.

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://111.111.111.111: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://111.111.111.111: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;
	}
}

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

파일을 안전하게 보호하고 구성 테스트를 수행합니다.

sudo service nginx configtest

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

sudo service nginx reload

이것이 작동하는지 확인하려면 /var/log/apache2에서 Apache의 로그 파일을 검사하고 test의 index.php 파일에 대한 GET 요청을 볼 수 있습니다. iofoobar.net. 이 설정의 유일한 주의 사항은 Apache가 정적 파일에 대한 액세스를 제한할 수 없다는 것입니다. 정적 파일에 대한 액세스 제어는 Nginx의 apache 가상 호스트 파일에서 구성해야 합니다.

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

결론

이 튜토리얼을 완료하면 example.comsample.org를 제공하는 Nginx와 foobar.net 를 제공하는 Apache와 함께 하나의 Ubuntu Droplet이 있어야 합니다. 및 test.io. Nginx는 Apache의 리버스 프록시 역할을 하지만 Nginx의 프록시 서비스는 투명하며 Apache 도메인에 대한 연결은 Apache 자체에서 직접 제공되는 것처럼 보입니다.