如何设置nginx作为反向代理Apache2在Ubuntu 12.04

如何设置nginx作为反向代理Apache2在Ubuntu 12.04 nginx(发音

如何在Ubuntu 12.04上设置nginx作为Apache2的反向代理

nginx (发音为“引擎x”)是一个免费的,开放源码的高性能HTTP服务器。 nginx以其稳定性,丰富的功能集,简单的配置和低资源消耗而闻名。 本教程将介绍如何在Ubuntu 12.04上的Apache2 Web服务器前设置nginx作为反向代理。

我不会保证这将为您工作!

1初步说明

在本教程中,我使用IP地址为192.168.0.100的hostname server1.example.com 。 这些设置可能会有所不同,因此您必须在适当的情况下更换它们。

我假设你有一个现有的Apache vhost(我将在本教程中使用example.com),它正在监听要通过nginx代理的IP地址192.168.0.100上的端口80

请注意,本教程仅涵盖http,而不是https(SSL)。

2配置Apache

我们要做的第一件事就是配置我们的Apache vhost,以监听80以外的未使用端口(例如8000 )上的localhost127.0.0.1 )。 打开/etc/apache2/ports.conf ...

vi /etc/apache2/ports.conf

...并修改端口80NameVirtualHostListen行以使用端口8000

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default
# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
# README.Debian.gz

NameVirtualHost *:8000
Listen 8000

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
Listen 443
</IfModule>

<IfModule mod_gnutls.c>
Listen 443
</IfModule>

接下来打开vhost配置文件(例如/etc/apache2/sites-available/example.com.vhost )...

vi /etc/apache2/sites-available/example.com.vhost

...并更改<VirtualHost>行以使用IP地址127.0.0.1和端口8000

<VirtualHost 127.0.0.1:8000>
[...]

我们将配置nginx作为透明代理,即它会将一个称为X-Forwarded-For的字段中的原始用户的IP地址传递给后台Apache。 当然,后端Apache应该在其访问日志中记录原始用户的IP地址,而不是nginx( 127.0.0.1 )的IP地址。 有两种方法可以实现这一点:

1)我们可以修改/etc/apache2/apache2.conf中的LogFormat行,并用%{X-Forwarded-For} i替换%h

vi /etc/apache2/apache2.conf

[...]
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[...]

2)在Debian / Ubuntu上,我们可以安装Apache模块libapache2-mod-rpaf ,它负责记录正确的IP地址:

apt-get install libapache2-mod-rpaf

所有这些更改后,重新启动Apache:

/etc/init.d/apache2 restart

3配置nginx

如果尚未安装nginx,请按如下方式进行安装:

apt-get install nginx

创建其系统启动链接并确保它已启动:

update-rc.d nginx defaults
/etc/init.d/nginx restart

现在应该在80口口听。

文件/ etc / nginx / proxy_params中有一些标准代理参数

vi /etc/nginx/proxy_params

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

因为我们稍后会在我们的nginx vhost for example.com的代理部分中包含该文件,如果您愿意,可以向该文件添加其他代理指令,例如:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 100M;
client_body_buffer_size 1m;
proxy_intercept_errors on;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 256 16k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_max_temp_file_size 0;
proxy_read_timeout 300;

现在为nginx创建example.com vhost - 确保它使用与http vhost for example.com相同的文档根(例如/var/www/example.com/web ),以便nginx可以直接传递静态文件而不传递要求Apache:

vi /etc/nginx/sites-available/example.com.vhost

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/example.com/web;
       if ($http_host != "www.example.com") {
                 rewrite ^ http://www.example.com$request_uri permanent;
       }
       index index.php index.html;

       location / {
                proxy_pass http://localhost:8000;
                include /etc/nginx/proxy_params;
       }
}

这是一个非常简单的配置,它将代理对Apache的所有请求。

要启用该vhost,我们从/ etc / nginx / sites-enabled /目录创建一个符号链接:

cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/example.com.vhost example.com.vhost

重新加载nginx以使更改生效:

/etc/init.d/nginx reload

您现在可以在浏览器中输入www.example.com ,并且您应该看到您的网站,但这次是通过nginx发送的。

正如我之前所说,这是一个非常简单的配置,代理了对Apache的所有请求。 但是,由于nginx比Apache提供静态文件(如JavaScript,CSS,图像,PDF文件,静态HTML文件等)更快,所以让nginx直接提供这些文件是个好主意。 这可以通过添加这些文件的新位置来完成,例如:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/example.com/web;
       if ($http_host != "www.example.com") {
                 rewrite ^ http://www.example.com$request_uri permanent;
       }
       index index.php index.html;

       location / {
                proxy_pass http://localhost:8000;
                include /etc/nginx/proxy_params;
       }
       location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
       }
}

重新加载nginx:

/etc/init.d/nginx reload

您甚至可以为这些文件设置Expires HTTP标头,以便浏览器将缓存这些文件(有关更多详细信息,请参阅在Nginx上创建浏览器缓存静态文件 ):

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/example.com/web;
       if ($http_host != "www.example.com") {
                 rewrite ^ http://www.example.com$request_uri permanent;
       }
       index index.php index.html;

       location / {
                proxy_pass http://localhost:8000;
                include /etc/nginx/proxy_params;
       }
       location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
                expires      30d;
       }
}

我们现在可以通过让nginx提供尽可能多的请求,并将剩余的请求加上PHP文件传递给Apache,从而进一步扩展这个设置:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/example.com/web;
       if ($http_host != "www.example.com") {
                 rewrite ^ http://www.example.com$request_uri permanent;
       }
       index index.php index.html;

       location / {
                try_files $uri @proxy;
       }
       location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ {
                expires      30d;
       }
       location @proxy {
                proxy_pass http://127.0.0.1:8000;
                include /etc/nginx/proxy_params;
       }
       location ~* \.php$ {
                proxy_pass http://127.0.0.1:8000;
                include /etc/nginx/proxy_params;
       }
}

重新加载nginx:

/etc/init.d/nginx reload

当然,您可以更精细地调整此设置,例如使用nginx proxy_cache(如果您的应用程序允许的话),例如,您必须确保验证码或购物车未被缓存,并且登录的用户总是得到一个新的页面副本)或者如果你的应用程序有一个完整的页面缓存 - nginx可以直接在这种情况下访问全页缓存(您可以在本教程中找到一个例子: 如何加快Drupal 7.7与Boost和nginx(Debian Squeeze) )。

关于作者

Falko Timme是所有者 nginx Webhosting Timme Hosting (超快nginx网页托管)。 他是Howtoing(自2005年以来)的主要维护者, 也是ISPConfig的核心开发人员之一 (自2000年起)。 他还为O'Reilly的“Linux系统管理”一书作出了贡献。