服务器已安装 apache。如何同时安装 nginx?

服务器已安装 apache。如何同时安装 nginx?

Apache 已安装并用于提供大部分 Django/Python 内容。我想安装 nginx 来提供静态内容。如何操作以及哪种配置比较好。

我在 Ubuntu 上,并且 Apache 是通过 apt-get 安装的。

答案1

  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
    
  2. 第二种选择:移动 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 服务器本身处理相同请求的压力。从本质上讲,这将产生与您所要求的效果相同的效果。由于静态页面和图像很少发生变化,因此它们几乎总是被前端缓存,而动态页面将被检测到并始终传递给后端。

相关内容