本教程将介绍如何在Ubuntu 16.04上的Apache2 Web服务器前设置nginx作为反向代理。 nginx (发音为“引擎x”)是一个免费的,开放源码的高性能HTTP服务器。 nginx以其稳定性,丰富的功能集,简单的配置和低资源消耗而闻名。
1初步说明
在本教程中,我使用IP地址为192.168.1.100
的hostname server1.example.com
。 这些设置可能会有所不同,因此您必须在适当的情况下更换它们。
我假设你有一个现有的Apache vhost(我将使用本教程中的apache默认vhost),它是通过您想通过nginx代理的IP地址192.168.1.100
上的端口80
监听
。 我将使用Ubuntu LAMP教程作为基础。 请注意,本教程仅涵盖http,而不是https(SSL)。
2配置Apache
我们要做的第一件事就是配置我们的Apache vhost,以监听80
以外的未使用端口(例如8000
)上的localhost
( 127.0.0.1
)。 打开/etc/apache2/ports.conf
...
nano /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.conf
Listen 8000
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
接下来打开vhost配置文件(例如/etc/apache2/sites-available/000-default.conf
)...
nano /etc/apache2/sites-available/000-default.conf
...并更改<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
:
nano /etc/apache2/apache2.conf
[...] #LogFormat "%h %l %u %t \"%r\" %>s %O \"%{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 -y install libapache2-mod-rpaf
所有这些更改后,重新启动Apache:
service apache2 restart
3配置nginx
如果尚未安装nginx,请按如下方式进行安装:
apt-get -y install nginx
创建其系统启动链接并确保它已启动:
systemctl enable nginx.service
service nginx restart
现在应该在80
口口听。
文件/ etc / nginx / proxy_params
中有一些标准代理参数
:
nano /etc/nginx/proxy_params
proxy_set_header Host $http_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 vhost for example.com
的代理部分中包含该文件,您可能希望在该文件中添加进一步的代理指令,如果您喜欢,例如:
proxy_set_header Host $http_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; 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的默认
vhost - 确保它使用与http
vhost for example.com
相同的文档根(例如/ var / www / html
),以便nginx可以直接传递静态文件,而不会将请求传递给Apache:
nano /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
}
}
这是一个非常简单的配置,它将代理对Apache的所有请求。
重新加载nginx以使更改生效:
service nginx reload
您现在可以在浏览器中输入服务器主机名或IP 192.168.1.100
,您应该看到apache的默认网站,但是这次通过nginx发送。
正如我之前所说,这是一个非常简单的配置,代理了对Apache的所有请求。 但是,由于nginx比Apache提供静态文件(如JavaScript,CSS,图像,PDF文件,静态HTML文件等)更快,所以让nginx直接提供这些文件是个好主意。 这可以通过添加这些文件的新位置来完成,例如:
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} location ~* \.(js|css|jpg|jpeg|gif|png|svg|ico|pdf|html|htm)$ { } }
重新加载nginx:
service nginx reload
您甚至可以为这些文件设置Expires
HTTP标头,以便浏览器将缓存这些文件(有关更多详细信息,请参阅在Nginx上创建浏览器缓存静态文件 ):
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
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 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
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; } 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:
service nginx reload
当然,您可以更精细地调整此设置,例如使用nginx proxy_cache(如果您的应用程序允许的话),例如,您必须确保验证码或购物车未被缓存,并且登录的用户总是得到一个新的页面副本)或者如果你的应用程序有一个完整的页面缓存 - nginx可以直接在这种情况下访问全页缓存(您可以在本教程中找到一个例子: 如何加快Drupal 7.7与Boost和nginx(Debian Squeeze) )。
4链接
- nginx: http : //nginx.net/
- Apache: http : //httpd.apache.org/
- Ubuntu: http : //www.ubuntu.com/