하나의 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.net
및 test.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
도 설치합니다.
먼저 패키지 목록을 업데이트하여 최신 패키지가 있는지 확인하십시오.
- sudo apt update
다음으로 Apache 및 PHP-FPM 패키지를 설치합니다.
- sudo apt install apache2 php-fpm
FastCGI Apache 모듈은 Ubuntu 저장소에서 사용할 수 없으므로 kernel.org에서 다운로드하고 dpkg
명령을 사용하여 설치합니다.
- wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
- 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
구성 파일 이름 바꾸기:
- sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
포트가 8080
으로 설정된 새 ports.conf
파일을 만듭니다.
- echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
참고: 웹 서버는 일반적으로 리버스 프록시를 구성할 때 127.0.0.1:8080
에서 수신 대기하도록 설정되지만 이렇게 하면 PHP의 환경 변수 SERVER_ADDR 값이 서버의 공용 IP 대신 루프백 IP 주소로 설정됩니다. . 우리의 목표는 웹사이트가 앞에서 리버스 프록시를 보지 않도록 Apache를 설정하는 것입니다. 따라서 모든 IP 주소에서 8080
을 수신하도록 구성합니다.
다음으로 Apache용 가상 호스트 파일을 만듭니다. 이 파일의
지시문은 포트 8080
에서만 사이트를 제공하도록 설정됩니다.
기본 가상 호스트를 비활성화합니다.
- sudo a2dissite 000-default
그런 다음 기존 기본 사이트를 사용하여 새 가상 호스트 파일을 만듭니다.
- sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf
이제 새 구성 파일을 엽니다.
- 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>
파일을 저장하고 새 구성 파일을 활성화합니다.
- sudo a2ensite 001-default
그런 다음 Apache를 다시 로드합니다.
- sudo systemctl reload apache2
Apache가 현재 8080
에서 수신 중인지 확인합니다.
- sudo netstat -tlpn
출력은 apache2
가 8080
에서 수신하는 다음 예와 같아야 합니다.
OutputActive 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
은 기본적으로 비활성화되어 있으므로 먼저 활성화해야 합니다.
- sudo a2enmod actions
기존 FastCGI 구성 파일의 이름을 바꿉니다.
- sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default
새 구성 파일을 만듭니다.
- 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>
변경 사항을 저장하고 구성 테스트를 수행합니다.
- sudo apachectl -t
Syntax OK가 표시되면 Apache를 다시 로드합니다.
- sudo systemctl reload apache2
경고 127.0.1.1을 사용하여 서버의 정규화된 도메인 이름을 안정적으로 결정할 수 없습니다. 이 메시지를 억제하려면 전역적으로 ServerName 지시문을 설정하십시오.
, 지금은 안전하게 무시해도 됩니다. 나중에 서버 이름을 구성합니다.
이제 Apache에서 PHP를 제공할 수 있는지 확인하겠습니다.
4단계 - PHP 기능 확인
phpinfo()
파일을 생성하고 웹 브라우저에서 액세스하여 PHP가 작동하는지 확인하십시오.
phpinfo
함수에 대한 호출을 포함하는 /var/www/html/info.php
파일을 만듭니다.
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
전제 조건 섹션의 초기 서버 설정을 따랐다면 Apache 방화벽을 활성화했을 가능성이 높습니다. 계속해서 현재 액세스할 수 없는 포트 8080
에서 IP에 액세스할 수 있는지 확인하겠습니다. 10단계에서 이 포트에 대한 공개 액세스를 제한합니다.
먼저 방화벽을 통해 포트 8080
을(를) 허용합니다.
- sudo ufw allow 8080
Apache 도메인을 보호할 것이므로 포트 443
의 TLS 트래픽이 들어올 수 있는지 확인하겠습니다.
Apache Full
이 포트 80
및 443
에서 트래픽을 허용하도록 허용:
- sudo ufw allow "Apache Full"
이제 방화벽 상태를 확인하십시오.
- sudo ufw status
전제 조건을 따랐다면 출력은 다음과 같습니다.
OutputTo 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)
다른 방화벽 규칙과 함께 포트 8080
및 Apache 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.net
및 test.io
에 대한 Apache 가상 호스트 파일을 생성해 보겠습니다. 이를 위해 먼저 두 사이트 모두에 대한 문서 루트 디렉터리를 만들고 구성을 쉽게 테스트할 수 있도록 해당 디렉터리에 일부 기본 파일을 배치합니다.
먼저 문서 루트 디렉터리를 만듭니다.
- sudo mkdir -v /var/www/foobar.net /var/www/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()
파일을 생성하여 PHP가 제대로 구성되었는지 테스트할 수 있습니다.
- 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 *: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
에 대해 유사한 구성을 만듭니다. 먼저 파일을 만듭니다.
- 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
디렉토리에 가상 호스트 파일에 대한 심볼릭 링크가 생성됩니다.
- sudo a2ensite foobar.net
- sudo a2ensite test.io
Apache에서 구성 오류를 다시 확인하십시오.
- sudo apachectl -t
오류가 없으면 Syntax OK가 표시됩니다. 다른 항목이 표시되면 구성을 검토하고 다시 시도하십시오.
구성에 오류가 없으면 Apache를 다시 로드하여 변경 사항을 적용합니다.
- sudo systemctl reload apache2
사이트가 작동하는지 확인하려면 http://foobar.net:8080
및 http://test.io를 엽니다. 8080
브라우저에서 각 사이트가 index.html 파일을 표시하는지 확인하십시오.
다음과 같은 결과가 표시됩니다.
또한 각 사이트의 info.php 파일에 액세스하여 PHP가 작동하는지 확인하십시오. http://foobar.net:8080/info.php
및 http://test.io:8080/info를 방문하세요. 브라우저에서 .php
.
4단계에서 본 것과 동일한 PHP 구성 사양 목록이 각 사이트에 표시됩니다.
이제 포트 8080
에서 Apache에서 호스팅되는 두 개의 웹사이트가 있습니다. 다음으로 Nginx를 구성해 보겠습니다.
6단계 - Nginx 설치 및 구성
이 단계에서는 Nginx를 설치하고 example.com
및 sample.org
도메인을 Nginx의 가상 호스트로 구성합니다. Nginx에서 가상 호스트를 설정하는 방법에 대한 전체 가이드는 Ubuntu 18.04에서 Nginx 서버 블록(가상 호스트)을 설정하는 방법을 참조하세요.
패키지 관리자를 사용하여 Nginx를 설치합니다.
- sudo apt install nginx
그런 다음 더 이상 사용하지 않을 기본 가상 호스트의 심볼릭 링크를 제거합니다.
- sudo rm /etc/nginx/sites-enabled/default
나중에 자체 기본 사이트(example.com
)를 만들 것입니다.
이제 Apache에 사용한 것과 동일한 절차를 사용하여 Nginx용 가상 호스트를 생성합니다. 먼저 두 웹사이트에 대한 문서 루트 디렉토리를 만듭니다.
- sudo mkdir -v /usr/share/nginx/example.com /usr/share/nginx/sample.org
Nginx 웹 사이트는 기본적으로 Nginx가 원하는 /usr/share/nginx
에 유지됩니다. Apache 사이트와 함께 /var/www/html
아래에 둘 수 있지만 이렇게 분리하면 사이트를 Nginx와 연결하는 데 도움이 될 수 있습니다.
Apache의 가상 호스트에서 했던 것처럼 설정이 완료된 후 테스트를 위해 index
및 phpinfo()
파일을 만듭니다.
- 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 요청을 처리하는 기본 가상 호스트로 만듭니다.
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
에 대한 가상 호스트 파일을 만듭니다.
- 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
디렉토리에 대한 심볼릭 링크를 생성하여 두 사이트를 모두 활성화합니다.
- 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 nginx -t
그런 다음 오류가 없으면 Nginx를 다시 로드합니다.
- 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 가상 호스트 파일을 만듭니다.
- 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;
}
}
파일을 저장하고 심볼릭 링크를 생성하여 이 새로운 가상 호스트를 활성화합니다.
- sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
구성을 테스트하여 오류가 없는지 확인하십시오.
- sudo nginx -t
오류가 없으면 Nginx를 다시 로드합니다.
- 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
로 존재하지만 구식이며 특정 구성 지시문을 지원하지 않습니다. 대신 소스에서 설치하겠습니다.
모듈을 빌드하는 데 필요한 패키지를 설치합니다.
- sudo apt install unzip build-essential apache2-dev
GitHub에서 최신 안정 릴리스를 다운로드합니다.
- wget https://github.com/gnif/mod_rpaf/archive/stable.zip
다운로드한 파일을 추출합니다.
- unzip stable.zip
파일이 포함된 새 디렉터리로 변경합니다.
- cd mod_rpaf-stable
모듈을 컴파일하고 설치합니다.
- 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
파일을 저장하고 편집기를 종료합니다.
이 디렉토리에 mod_rpaf
에 대한 구성 지시문을 포함할 rpaf.conf
라는 또 다른 파일을 만듭니다.
- 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 -
ServerName
및ServerAlias
가 작동하도록 가상 호스트 이름을 업데이트합니다. - RPAF_SetHTTPS -
X-Forwarded-Proto
에 포함된 값을 기반으로HTTPS
환경 변수를 설정합니다. - RPAF_SetPort -
SERVER_PORT
환경 변수를 설정합니다. Apache가 SSL 프록시 뒤에 있을 때 유용합니다.
rpaf.conf
를 저장하고 모듈을 활성화합니다.
- sudo a2enmod rpaf
이렇게 하면 mods-enabled
디렉토리에 rpaf.load
및 rpaf.conf
파일의 심볼릭 링크가 생성됩니다. 이제 구성 테스트를 수행합니다.
- sudo apachectl -t
오류가 없으면 Apache를 다시 로드합니다.
- sudo systemctl reload apache2
phpinfo()
페이지 http://foobar.net/info.php
및 http://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
파일을 엽니다.
- sudo nano /etc/nginx/sites-available/apache
자체 server
블록에 foobar.net
및 test.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 저장소를 추가합니다.
- sudo add-apt-repository ppa:certbot/certbot
새 리포지토리를 추가할지 묻는 메시지가 나타나면 ENTER
를 누르십시오. 그런 다음 패키지 목록을 업데이트하여 새 리포지토리의 패키지 정보를 선택합니다.
- sudo apt update
그런 다음 apt
를 사용하여 Certbot의 Nginx 패키지를 설치합니다.
- sudo apt install python-certbot-nginx
설치되면 certbot
명령을 사용하여 foobar.net
및 www.foobar.net
에 대한 인증서를 생성합니다.
- sudo certbot --nginx -d foobar.net -d www.foobar.net
이 명령은 Certbot에게 nginx
플러그인을 사용하도록 지시하고 -d
를 사용하여 인증서가 유효하기를 원하는 이름을 지정합니다.
certbot
을 처음 실행하는 경우 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 표시됩니다. 이렇게 하면 certbot
이 Let’s Encrypt 서버와 통신한 다음 인증서를 요청하는 도메인을 제어하는지 확인하기 위해 챌린지를 실행합니다.
다음으로 Certbot은 HTTPS 설정을 구성하는 방법을 묻습니다.
OutputPlease 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가 다시 로드하여 새 설정을 선택합니다.
이제 두 번째 도메인에 대한 명령을 실행합니다.
- 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 명령을 사용하여 차단할 수 있습니다.
- 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
파일을 엽니다.
- 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 구성 파일의 콘텐츠를 제공하지 못합니다.
파일을 저장하고 구성 테스트를 수행합니다.
- sudo nginx -t
테스트가 성공하면 Nginx를 다시 로드합니다.
- sudo service nginx reload
제대로 작동하는지 확인하려면 /var/log/apache2
에서 Apache의 로그 파일을 검사하고 info.php
에 대한 GET
요청을 확인할 수 있습니다. test.io
및 foobar.net
파일. tail
명령을 사용하여 파일의 마지막 몇 줄을 보고 -f
스위치를 사용하여 파일에서 변경 사항을 확인합니다.
- 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.net
및 test를 제공하는 Apache와 함께
. Nginx는 Apache의 리버스 프록시 역할을 하지만 Nginx의 프록시 서비스는 투명하며 Apache 도메인에 대한 연결은 Apache 자체에서 직접 제공되는 것처럼 보입니다. 이 방법을 사용하여 보안 및 정적 사이트를 제공할 수 있습니다.example.com
및 sample.org
를 제공하는 Ubuntu 서버가 하나 있습니다. .io