如何在 apache 前面用 nginx 提供多个域静态文件?

如何在 apache 前面用 nginx 提供多个域静态文件?

我想从同一台服务器运行多个域。我希望 nginx 位于 apache 前面并提供静态文件。因此对 one.com/site_media/logo.png 的请求指向 /var/www/one/site_media/logo.png,而对 two.com/site_media/logo.png 的请求指向 /var/www/two/site_media/logo.png。以下配置哪里出错了?

端口配置文件

 NameVirtualHost *:80
 Listen 8080

nginx/sites-available/one.com

server {
   listen 80;
   server_name one.com;
   access_log /var/www/one/nginx_access.log;
   error_log /var/www/one/nginx_error.log;
   location / {
   proxy_pass  http://127.0.0.1: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;
   proxy_set_header   X-Magic-Header "secret";
   client_max_body_size 10m;
  }

  location ^~ /site_media/ {
     root /var/www/one;
     if ($query_string) {
         expires max;
     }
  }

nginx/sites-available/two.com

server {
   listen 80;
   server_name two.com;
   access_log /var/www/two/nginx_access.log;
   error_log /var/www/two/nginx_error.log;
   location / {
   proxy_pass  http://127.0.0.1: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;
   proxy_set_header   X-Magic-Header "secret";
   client_max_body_size 10m;
  }

  location ^~ /site_media/ {
     root /var/www/two;
     if ($query_string) {
         expires max;
     }
  }

apache2/sites-available/one.com

<VirtualHost *:8080>
    ServerName one.com
    ServerAlias www.one.com
    WSGIScriptAlias / /var/www/one/one.wsgi
    ErrorLog /var/www/one/apache_error.log
    LogLevel warn
    CustomLog /var/www/one/apache_access.log combined
</VirtualHost>

apache2/sites-available/two.com

<VirtualHost *:8080>
    ServerName two.com
    ServerAlias www.two.com
    WSGIScriptAlias / /var/www/two/two.wsgi
    ErrorLog /var/www/one/apache_error.log
    LogLevel warn
    CustomLog /var/www/one/apache_access.log combined
</VirtualHost>

two.com 上对“/site_media/logo.png”的请求失败,因为服务器查找的是 /var/www/one/site_media。我想保留两个网站的“/site_media”href。有没有更好的方法来重写 nginx 位置 ^~ /site_media/?或者其他什么?

(编辑)我的解决方法是:

  location ^~ /site_media/ {
     if ($host = 'one.com') {
         root /var/www/one;
     }
     if ($host = 'two.com') {
         root /var/www/two;
     }
     if ($query_string) {
         expires max;
     }

这看起来确实很“黑客”并且不优雅。

答案1

根指令应该处于服务器级别。

server {
   listen 80;
   server_name one.com;
   root /var/www/one;
   ...

server {
   listen 80;
   server_name two.com;
   root /var/www/two;
   ...

还要确保 Apache 中的文档根目录为每个文档正确定义。

答案2

看起来非常复杂。为什么不在所有级别都使用 nginx?无论如何,我遇到的有关 NGINX 配置的最佳参考仍然是: https://calomel.org/nginx.html

  • 选项 1:使用 Nginx 网络服务器提供静态文件

    这是运行在端口 80 (http) 上的一个基本的 Web 服务器,用于提供网页。虽然我们添加了很多安全检查,但这是你能得到的最基本的服务器。在 AMD64 2GHz 机器上,此配置每分钟可以轻松提供数千个页面。

相关内容