Назад | Перейти на главную страницу

Как вы обслуживаете несколько статических файлов домена с помощью nginx перед apache?

Я хочу запускать несколько доменов с одного сервера. Я хотел бы, чтобы 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 . Где я ошибаюсь в следующей конфигурации?

ports.conf

 NameVirtualHost *:80
 Listen 8080

nginx / сайты-доступные / 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 / сайты-доступные / 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 / сайты-доступные / 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 / сайты-доступные / 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. Я хотел бы сохранить hrefs "/ site_media" для обоих сайтов. Есть ли лучший способ переписать расположение nginx ^ ~ / site_media /? Или что-то другое?

(Edit) Мое обходное решение:

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

Это кажется действительно "хакерским" и не изящным.

Директивы root должны быть на уровне сервера.

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

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

Также убедитесь, что корень документа в Apache правильно определен для каждого.

Кажется невероятно сложным. Почему бы вам не использовать nginx на всех уровнях? В любом случае, лучший справочник по конфигурациям NGINX, с которыми я столкнулся, по-прежнему: https://calomel.org/nginx.html

  • Вариант 1: веб-сервер Nginx для обслуживания статических файлов

    Это базовый веб-сервер, работающий на порту 80 (http), обслуживающий веб-страницы. Хотя мы добавили довольно много проверок безопасности, это самый простой сервер, который вы можете получить. На машине AMD64 2 ГГц эта конфигурация легко будет обслуживать тысячи страниц в минуту.