如何在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
)上的localhost
( 127.0.0.1
)。 打开/etc/apache2/ports.conf
...
vi /etc/apache2/ports.conf
...并修改端口80
的NameVirtualHost
和Listen
行以使用端口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) )。
4链接
- nginx: http : //nginx.net/
- nginx维基: http : //wiki.codemongers.com/Main
- Apache: http : //httpd.apache.org/
- Ubuntu: http : //www.ubuntu.com/
关于作者
Falko Timme是所有者 Timme Hosting (超快nginx网页托管)。 他是youcl(自2005年以来)的主要维护者, 也是ISPConfig的核心开发人员之一 (自2000年起)。 他还为O'Reilly的“Linux系统管理”一书作出了贡献。