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

Использование nginx / varnish для страниц с SSL и без SSL

Отказ от ответственности: я разместил это в Stackoverflow, и я подумал, что он может там лучше подойти. Ссылка на вопрос находится ниже, если кто-то хочет там ответить.

-

Имею следующее:

domain.com - многие URL-адреса, для которых не нужен SSL (я бы хотел использовать Varnish для кеширования всего этого) domain.com/shop - все URL-адреса должны использовать SSL (Varnish не нужен, я бы хотел прослушивать порт 443)

Я в основном ищу лучший способ настроить сервер для кеширования всех uris, которые не нуждаются в SSL, поскольку он должен работать на порту 443. Все запросы порта 8080 отправляются на Varnish и работают правильно. Кроме того, я хочу убедиться, что на domain.com отправляется не-ssl-запрос (включая запросы www). Я делал это раньше, но по какой-то причине SSL в уравнении все усложняет.

Моя конфигурация следующая:

`server {       
   listen 8080;
   server_name domain.com;  

   root /var/www/domain.com/public_html;

   index index.html index.htm index.php;

   location / {
     try_files $uri $uri/ /index.php?q=$uri&$args;                     
   } 

   location ~ \.php$ {
     fastcgi_buffers 8 256k;
     fastcgi_buffer_size 128k;
     fastcgi_intercept_errors on;
     include fastcgi_params;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     fastcgi_pass unix:/dev/shm/php-fpm-www.sock;    

     # Tried using to shut off http on all non SSL needed urls.
     fastcgi_param  HTTPS off;      
   }   

}              

server {    
    listen 443 ssl;    
    server_name domain.com;  

    ssl_certificate   /etc/nginx/keys/www.domain.com.chained.crt;    
    ssl_certificate_key   /etc/nginx/keys/domain.com.key;

    access_log  /var/www/domain.com/logs/access.log ;
    error_log  /var/www/domain.com/logs/error.log ;

    root /var/www/domain.com/public_html;

    index index.html index.htm index.php;

    location / {
      try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    location ~ \.php$ {
      fastcgi_buffers 8 256k;
      fastcgi_buffer_size 128k;
      fastcgi_intercept_errors on;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_pass unix:/dev/shm/php-fpm-www.sock;  

      #https will not work without this.
      fastcgi_param  HTTPS on;   
    }

}                       

Попробуйте выделить порт:

Varnish:80 => NginX:8080
NginX:443

Таким образом, вы передаете все через лак как слой над кешем, поэтому количество запросов к NginX сокращается.

Ваше приложение должно контролировать через заголовки, как содержимое должно кэшироваться, и по умолчанию оно должно работать нормально - динамические файлы передаются в NginX, а статические файлы обслуживаются из кеша до тех пор, пока это указано в заголовке даты истечения срока действия.

Вот как мы могли это сделать. Я использую этот шаблон для включения SSH для страниц администратора (в WordPress). Надеюсь, это сработает в вашей ситуации.

server {
  listen 8080;
  server_name domainname.com;
  root /path/to/domainname.com/installation;
  index index.php;

  location ~ \.php$ {
    # Request to /shop to go via HTTPS
    location ~ /shop {
      return 301 https://$host$request_uri;
    }

    # Process non-/shop PHP requests
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass  unix:/dev/shm/php-fpm-www.sock;
  }

  location / {
    try_files $uri $uri/ /index.php;
  }

}

server {
  listen 443 ssl;
  server_name domainname.com;

  ssl_certificate xyz.crt;
  ssl_certificate_key xyz.key;

  root /path/to/domainname.com/installation;
  index index.php;

  # Process only the requests to shop
  location ~ /shop {
    location ~ \.php$ {
      try_files $uri =404;
      include fastcgi_params;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_pass  unix:/dev/shm/php-fpm-www.sock;
      fastcgi_param  HTTPS on;
    }
  }

  # Redirect everything else to port 80 (Varnish)
  location / {
    return 301 http://$host$request_uri;
  }
}