如何在Ubuntu 16.04上安装nginx作为Apache的反向代理

本教程将介绍如何在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 )上的localhost127.0.0.1 )。 打开/etc/apache2/ports.conf ...

nano /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.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链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏