Apache 已安装并用于提供大部分 Django/Python 内容。我想安装 nginx 来提供静态内容。如何操作以及哪种配置比较好。
我在 Ubuntu 上,并且 Apache 是通过 apt-get 安装的。
答案1
第一个选项:您有几个 IP 地址吗?将 apache 绑定到其中一个,将 nginx 绑定到另一个。
在 Debian 世界中
对于 apache,/etc/apache2/ports.conf 中包括:
Listen 1.1.2.3:80
在 /etc/apache2/sites-enabled 中的 vhost 文件中更改:
NameVirtualHost 1.1.2.3:80; <VirtualHost 1.1.2.3:80> .. <VirtualHost/>
对于 nginx,在 /etc/nginx/sites-enabled/ 中添加:
listen 1.1.2.4:80
第二种选择:移动 apache 以监听不同的端口 [文件如上所述。例如告诉 apache 监听 127.0.0.1:8080] 并指示 nginx 在 nginx 提供 /static/ 服务时将动态流量反向代理到你的 apache - 例如:
server { listen 1.1.2.3:80; server_name some.name another.dname; access_log /var/log/nginx/something-access.log; location / { proxy_pass http://localhost:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~* ^.+\.(jpg|js|jpeg|png)$ { root /some/where/on/your/disks; } ; put your static hosting config here. }
顺便说一句 - 考虑将静态内容放在另一个域上。这应该会稍微提高最终用户的速度。
答案2
实现此目的的方法有很多种。我更喜欢让一个应用程序专门决定哪个服务器处理哪种内容,而后端服务器则只提供它们所请求的文件。
为此,我在前端使用 Varnish 反向代理,监听端口 80。在其后面,我有 Apache(端口 8880)和 nginx(端口 8881),两者都配置为相同的域并指向相同的目录结构。在我的 Varnish 配置文件中,我有以下内容:
backend apache {
.host = "192.168.0.2";
.port = "8880";
}
backend nginx {
.host = "192.168.0.2";
.port = "8881";
}
[...]
if (req.url ~ "\.(png|gif|jpg|ico|html|htm|js|css|txt)$") {
set req.backend = nginx;
} else {
set req.backend = apache;
}
当然,还有更多内容,但你已经明白了。
由于您已经安装了 Apache 和 nginx,您可能需要浏览这链接,它描述了与您的非常类似的情况,但使用 nginx 作为静态内容的前端,然后将请求传递给 Apache。
如果您想简单一点,只需在 Apache 前面使用反向缓存代理(例如 Varnish 或 nginx)。它的作用是缓存请求,以便快速将其提供给客户端,同时减轻 Web 服务器本身处理相同请求的压力。从本质上讲,这将产生与您所要求的效果相同的效果。由于静态页面和图像很少发生变化,因此它们几乎总是被前端缓存,而动态页面将被检测到并始终传递给后端。