如何配置的Nginx作为Web服务器和一个Ubuntu的14.04Droplet反向代理的Apache

本教程将告诉你如何配置Nginx既作为Web服务器和Apache的反向代理 - 都在一个Droplet。根据不同的Web应用程序,可能需要更改代码保持Apache的反向代理感知,SSL站点都配置时尤其如此。为了确保这一点,我们将这样看来Apache直接处理来自Web客户端请求安装一个名为** ** mod_rpaf重写其特定的环境变量Apache模块。

介绍

Apache和Nginx是经常与PHP一起使用的两个流行的开源web服务器。 当托管具有不同要求的多个网站时,在同一虚拟机上运行它们可能是有用的。 在单个系统上运行两个Web服务器的一般解决方案是使用多个IP地址或不同的端口号。

具有IPv4和IPv6地址的小队可以配置为在一个协议上为Apache站点服务,在另一个协议上为Nginx站点提供服务,但这不是目前可行的,因为ISP采用的IPv6仍然不广泛。 拥有像一个不同的端口号818080为第二个Web服务器是另一种解决方案,但与端口号分享的网址(例如http://example.com:81 )并不总是合理的或理想。

本教程将告诉你如何配置Nginx作为一个Web服务器和作为Apache的反向代理 - 所有在一个Droplet。 根据Web应用程序,可能需要进行代码更改以保持Apache反向代理感知,尤其是在配置SSL站点时。 为了确保这一点,我们将这样看来Apache直接处理来自Web客户端请求安装Apache模块名为mod_rpaf其重写某些环境变量。

我们将在一个Droplet上托管四个域名。 :两个由Nginx的送达example.com (默认的虚拟主机)和sample.org 剩下的两个, foobar.nettest.io ,将被Apache服务。

先决条件

  • 一个新的Ubuntu 14.04 Droplet。

  • 以标准用户帐户sudo权限。 您可以通过以下的的第2步和3设置了一个标准帐户与Ubuntu 14.04初始服务器设置

  • 所需的域名应指向DigitalOcean控制面板中的Droplet的IP地址。 见第3步如何建立一个主机名与DigitalOcean对于如何做到这一点的例子。 如果您托管站点DNS别处,你应该建立相应的A记录有来代替。

可选引用

本教程需要Apache和Nginx中的虚拟主机的基本知识,以及SSL证书创建和配置。 有关这些主题的详细信息,请参阅以下文章。

第1步 - 安装Apache和PHP5-FPM

除了Apache和PHP-FPM之外,我们还必须安装PHP FastCGI Apache模块。 这是libapache2-mod-fastcgi ,在Ubuntu的多元宇宙库中找到,它必须首先在被激活sources.list文件。

sudo nano /etc/apt/sources.list

找到以下行,并通过删除井号(注释它们#开头)。

# deb http://mirrors.digitalocean.com/ubuntu trusty multiverse

 . . .

# deb http://mirrors.digitalocean.com/ubuntu trusty-updates multiverse

这应该留下你的下面显示。

 deb http://mirrors.digitalocean.com/ubuntu trusty multiverse

 . . .

 deb http://mirrors.digitalocean.com/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 ,并配置它使用PHP5-FPM的工作mod_fastcgi模块。 编辑Apache配置文件并更改Apache的端口号。

sudo nano /etc/apache2/ports.conf

找到以下行:

Listen 80

将其更改为:

Listen 8080

保存并退出ports.conf

注:Web服务器通常设置为监听127.0.0.1:8080配置反向代理,但是这样做会设置PHP的环境变量SERVER_ADDR到环回的IP地址,而不是服务器的公网IP的价值的时候。 我们的目标是设置Apache的方式,使其网站没有看到一个反向代理在它的前面。 因此,我们将其配置为监听8080上的所有IP地址。

接下来,我们将编辑Apache的默认虚拟主机文件。 <VirtualHost>在此文件指令被设置为只服务于网站的端口80

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

第一行应该是:

<VirtualHost *:80>

将其更改为:

<VirtualHost *:8080>

保存文件并重新加载Apache。

sudo service apache2 reload

验证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

第3步 - 配置Apache使用mod_fastcgi

Apache可与mod_php在默认情况下,但它需要额外配置与PHP5-FPM工作。

注意:如果你想与LAMP的现有安装本教程mod_php ,与第一禁用:

sudo a2dismod php5

我们将增加一个配置块mod_fastcgi取决于mod_actionmod-action默认是禁用的,所以我们首先需要启用它。

sudo a2enmod actions

找到您的Droplet上安装了哪个版本的Apache:

sudo apache2 -v

编辑fastcgi相应配置文件。 这些配置指令传递的请求.php文件到PHP5-FPM UNIX套接字。

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

添加以下行的底部<IfModule mod_fastcgi.c> . . . </IfModule> <IfModule mod_fastcgi.c> . . . </IfModule> <IfModule mod_fastcgi.c> . . . </IfModule>阻塞的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的不需要<Directory>部分,因此添加以下内容:

 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

如果显示语法OK刷新Apache。 如果您看到警告Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message. Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message. ,这很好。 它不影响我们现在。

sudo service apache2 reload

第4步 - 验证PHP功能

检查PHP可以通过创建phpinfo()文件,并从Web浏览器访问它。

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

要看到在浏览器中的文件,去http:// 111.111.111.111 :8080/info.php ,但使用你的Droplet的IP地址。 这将给你一个PHP正在使用的配置规范的列表。

phpinfo服务器API

phpinfo PHP变量

在页面的顶部,检查服务器APIFPM / FastCGI的 的方式在页面约三分之二,PHP变量部分会告诉你SERVER_SOFTWARE就是Apache在Ubuntu。 这些确认mod_fastcgi是积极和Apache使用PHP5-FPM处理PHP文件。

第5步 - 为Apache创建虚拟主机

我们将创建域中的两个Apache的虚拟主机文件foobar.nettest.io 这是从两个站点创建文档根目录。

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

现在我们将在安装完成后将两个文件添加到每个目录进行测试。

首先,我们将创建一个index为每个站点文件。

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中设置虚拟主机的完整指南,请参阅如何设置Apache虚拟主机在Ubuntu 14.04 LTS

现在,这两个Apache的虚拟主机都设置时,可使用网站a2ensite命令。 这将创建一个符号链接到虚拟主机文件sites-enabled目录。

sudo a2ensite foobar.net
sudo a2ensite test.io

再次检查Apache的配置错误。

sudo apachectl -t

如果显示语法OK重新加载它。

sudo service apache2 reload

要确认网站正在努力,开放http:// foobar.net :8080http:// test.io :8080在浏览器中,并确认他们正在展示他们的index.html文件。

你应该看到:

foob​​ar.net索引页

test.io索引页

此外,检查PHP是通过访问info.php的文件工作: http:// foobar.net :8080/info.phphttp:// test.io :8080/info.php

你应该看到在每个站点相同的PHP配置规格列表,在第1步中看到我们现在有在港举办Apache的两个网站8080

第6步 - 安装和配置Nginx

在这一步中,我们将Nginx的安装和配置域example.comsample.org为Nginx的虚拟主机。 有关在Nginx的设置虚拟主机的完整指南,请参阅如何设置的Nginx服务器块(虚拟主机),在Ubuntu 14.04 LTS

安装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 {. . .} server {. . .} 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

现在acccess的phpinfo()通过在web浏览器的Nginx虚拟主机文件http:// example.com /info.phphttp:// sample.org /info.php 再看下的PHP变量部分。

Nginx PHP变量

[“SERVER_SOFTWARE”]应该说nginx的 ,说明文件被直接Nginx的服务。[“DOCUMENT_ROOT”]应该指向在此步骤中的每个Nginx的网站先前创建的目录中。

在这一点上,我们已经安装了Nginx并创建了两个虚拟主机。 接下来,我们将设置一个额外的虚拟主机来代理面向托管在Apache上的域的请求。

第7步 - 为Apache的虚拟主机配置Nginx

在本节中,我们将创建的多个域名额外的Nginx虚拟主机server_name指令。 对这些域名的请求将代理到Apache。

创建一个新的Nginx虚拟主机文件:

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

添加下面的代码块。 它指定两个Apache虚拟主机域的名称,并将其请求代理给Apache。 请记住,在使用公共IP地址proxy_pass

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

打开浏览器,访问http:// foobar.net /info.php Apache的域名之一。 向下滚动到PHP变量部分,检查显示的值。

Apache的phpinfo通过Nginx

变量SERVER_SOFTWAREDOCUMENT_ROOT应确认该请求被Apache处理。 变量HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR被Nginx的增加了,应当说明你从浏览器访问URL的计算机的公网IP地址。

我们已经成功地设置Nginx来代理对特定域的请求到Apache。 下一步骤是配置Apache设置变量REMOTE_ADDR就好像它是直接处理这些请求。

第8步 - 安装和配置mod_rpaf

在这一步中,我们将安装Apache模块名为mod_rpaf其重写REMOTE_ADDR,HTTPSHTTP_PORT的基于反向代理所提供的数值的数值。 没有这个模块,一些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

创建在一个文件mods-available它加载rpaf模块目录。

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 -代理IP来调整HTTP请求。
  • RPAF_SetHostName -更新虚拟主机名称,以便服务器名和ServerAlias工作。
  • RPAF_SetHTTPS -设置HTTPS基于包含在价值环境变量X-Forwarded-Proto
  • RPAF_SetPort -设置SERVER_PORT环境变量。 当Apache在SSL代理之后时有用。

rpaf.conf并启用模块。

sudo a2enmod rpaf

这将创建文件的符号链接rpaf.loadrpaf.confmods-enabled目录。 现在做一个配置测试。

sudo apachectl -t

刷新Apache如果返回语法确定

sudo service apache2 reload

访问Apache的网站“之一phpinfo()您的浏览器页面,并检查PHP变量部分。 REMOTE_ADDR变量现在也可以是本地计算机的公网IP地址。

第9步 - 设置HTTPS网站(可选)

在此步骤中,我们将为在Apache上托管的域配置SSL证书。 Nginx支持SSL终止,所以我们可以设置SSL,而不修改Apache的配置文件。 mod_rpaf模块确保所需的环境变量在Apache设置,使应用程序无缝工作背后SSL反向代理。

为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 []:

现在打开apache来代理从Nginx的到Apache的要求虚拟主机文件。

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

由于我们对每个域单独的证书和密钥都需要有单独的server { . . . } server { . . . } server { . . . }块各个领域。 您应该删除它的当前内容,完成后,你apache虚拟主机文件应该类似于下。

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

访问Apache的域在同一个浏览器https://的前缀: https:// foobar.net /info.php

phpinfo ssl

看在PHP中的变量部分。 可变SERVER_PORT已被设置为443HTTPS设置为 ,好像Apache直接通过HTTPS访问。 通过设置这些变量,PHP应用程序不必专门配置为在逆向代理之后工作。

第10步 - 阻止对Apache的直接访问(可选)

因为Apache是在监听端口8080上的公网IP地址,它是由每个人都可以访问。 它可以通过在防火墙规则集中使用以下IPtables命令来阻止。

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

确保使用您的Droplet的IP地址代替红色的示例。 一旦端口8080被挡在你的防火墙,测试Apache是它无法访问。 打开Web浏览器,并尝试访问Apache的域名之一,在端口8080 例如: http:// example.com :8080

浏览器应显示“无法连接”或“网页不可用”错误消息。 随着iptables的tcp-reset到位的选择,外人会看到端口之间没有什么区别8080 ,并且没有它的任何服务的端口。

注:iptables规则默认情况下不生存重新启动系统。 有多种方式来保存iptables规则,但最简单的就是使用iptables-persistent在Ubuntu的存储库。

第1步1 - 使用Nginx提供静态文件(可选)

当Nginx代理请求Apache的域时,它将每个文件请求发送到域到Apache。 Nginx在提供图像,JavaScript和样式表等静态文件方面比Apache快。 因此,在本节中,我们将配置的Nginx的apache虚拟主机文件直接提供静态文件,只是发送请求PHP到Apache。

打开apache虚拟主机文件。

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

添加两个额外的位置块到每个服务器块以红色显示在下面的代码块。

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

为了验证这是工作,你可以检查Apache的日志文件/var/log/apache2 ,并了解了GET请求index.php的文件test.iofoobar.net 此设置的唯一注意事项是Apache将无法限制对静态文件的访问。 对静态文件的访问控制将需要的Nginx的进行配置apache虚拟主机文件。

警告: location ~ /\.指令是非常重要的,包括。 这可以防止Nginx的从印刷就像文件内容.htaccess.htpasswd

结论

在完成本教程,您现在应该有一个Ubuntu的Droplet与Nginx的服务example.comsample.org ,使用Apache服务一起foobar.nettest.io 虽然Nginx充当Apache的反向代理,Nginx的代理服务是透明的,并且与Apache的域的连接似乎直接从Apache本身提供。