하나의 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.net
및 test.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 저장소를 업데이트하여 최신 패키지가 있는지 확인하십시오.
- sudo apt-get update
다음으로 필요한 패키지를 설치합니다.
- sudo apt-get install apache2 libapache2-mod-fastcgi php-fpm
다음으로 Apache의 기본 구성을 변경해 보겠습니다.
2단계 - Apache 및 PHP-FPM 구성
이 단계에서는 Apache의 포트 번호를 8080으로 변경하고 mod_fastcgi 모듈을 사용하여 PHP-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 systemctl reload apache2
Apache가 현재 8080
에서 수신 대기 중인지 확인합니다.
- 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의 기존 설치에서 이 튜토리얼을 시도하는 경우 먼저 다음을 사용하여 비활성화하십시오.
- sudo a2dismod php7.0
mod_action
에 의존하는 mod_fastcgi
에 대한 구성 블록을 추가할 것입니다. mod_action
은 기본적으로 비활성화되어 있으므로 먼저 활성화해야 합니다.
- sudo a2enmod actions
이러한 구성 지시문은 .php
파일에 대한 요청을 PHP-FPM UNIX 소켓으로 전달합니다.
- 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
에 대한 변경 사항을 저장하고 구성 테스트를 수행합니다.
- sudo apachectl -t
Syntax OK가 표시되면 Apache를 다시 로드합니다. 경고 127.0.1.1을 사용하여 서버의 정규화된 도메인 이름을 안정적으로 결정할 수 없습니다. 이 메시지를 표시하지 않도록 ServerName 지시문을 전체적으로 설정하십시오.
, 좋습니다. 지금은 우리에게 영향을 미치지 않습니다.
- sudo systemctl reload apache2
이제 Apache에서 PHP를 제공할 수 있는지 확인하겠습니다.
4단계 - PHP 기능 확인
phpinfo()
파일을 생성하고 웹 브라우저에서 액세스하여 PHP가 작동하는지 확인하십시오.
- 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.net
및 test.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()
파일을 생성하여 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에서 호스팅되는 두 개의 웹사이트가 있습니다.
6단계 - Nginx 설치 및 구성
이 단계에서는 Nginx를 설치하고 example.com
및 sample.org
도메인을 Nginx의 가상 호스트로 구성합니다. Nginx에서 가상 호스트를 설정하는 방법에 대한 전체 가이드는 Ubuntu 16.04에서 Nginx 서버 블록(가상 호스트)을 설정하는 방법을 참조하세요.
패키지 관리자를 사용하여 Nginx를 설치합니다.
- sudo apt-get install nginx
그런 다음 더 이상 사용하지 않을 기본 가상 호스트의 심볼릭 링크를 제거합니다. 나중에 자체 기본 사이트(example.com
)를 만들 것입니다.
- sudo rm /etc/nginx/sites-enabled/default
이제 Apache에 사용한 것과 동일한 절차를 사용하여 Nginx용 가상 호스트를 생성합니다. 먼저 두 웹사이트에 대한 문서 루트 디렉토리를 만듭니다.
- sudo mkdir -v /usr/share/nginx/{example.com,sample.org}
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 요청을 처리하는 기본 가상 호스트로 만듭니다.
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
에 대한 가상 호스트 파일을 만듭니다.
- 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
디렉토리에 대한 심볼릭 링크를 생성하여 두 사이트를 모두 활성화합니다.
- 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
그런 다음 OK가 표시되면 Nginx를 다시 로드합니다.
- 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 가상 호스트 파일을 만듭니다.
- 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
OK가 표시되면 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-get 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
이 디렉터리에 다른 파일을 만듭니다. 여기에는 구성 지시문이 포함됩니다.
- 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
를 저장하고 모듈을 활성화합니다.
- sudo a2enmod rpaf
이렇게 하면 mods-enabled
디렉토리에 rpaf.load
및 rpaf.conf
파일의 심볼릭 링크가 생성됩니다. 이제 구성 테스트를 수행합니다.
- sudo apachectl -t
Syntax OK가 반환되면 Apache를 다시 로드합니다.
- sudo systemctl reload apache2
브라우저에서 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.net
및 test.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) []:foobar.net
Email Address []:
이제 Nginx에서 Apache로 요청을 프록시하는 Apache 가상 호스트 파일을 엽니다.
- 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에서 수신하도록 지시했습니다.
파일을 저장하고 구성 테스트를 수행합니다.
- sudo nginx -t
테스트가 성공하면 Nginx를 다시 로드합니다.
- 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 명령을 사용하여 차단할 수 있습니다.
- 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
가상 호스트 파일을 엽니다.
- 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
와 같은 파일의 내용을 인쇄하지 못합니다.
파일을 저장하고 구성 테스트를 수행합니다.
- sudo nginx -t
테스트가 성공하면 Nginx를 다시 로드합니다.
- sudo service nginx reload
이것이 작동하는지 확인하려면 /var/log/apache2
에서 Apache의 로그 파일을 검사하고 test의
및 info.php
파일에 대한 GET 요청을 볼 수 있습니다. iofoobar.net
. tail
명령을 사용하여 파일의 마지막 몇 줄을 보고 -f
스위치를 사용하여 파일에서 변경 사항을 확인합니다.
- 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.net
및 test를 제공하는 Apache와 함께
. Nginx는 Apache의 리버스 프록시 역할을 하지만 Nginx의 프록시 서비스는 투명하며 Apache 도메인에 대한 연결은 Apache 자체에서 직접 제공되는 것처럼 보입니다. 이 방법을 사용하여 보안 및 정적 사이트를 제공할 수 있습니다.example.com
및 sample.org
를 제공하는 Ubuntu Droplet이 하나 있습니다. .io