Usando nginx / verniz para páginas SSL e não SSL

2

Disclaimer: Eu postei isso no Stackoverflow, assim como eu pensei que poderia ter se encaixado melhor lá. O link para a questão está abaixo se alguém quiser responder lá.

-

Eu tenho o seguinte:

domain.com - muitos URLs que não precisam de SSL (eu gostaria de usar o Varnish para armazenar em cache todos eles) domain.com/shop - todos os URLs devem estar usando SSL (não precisa de verniz, gostaria de ouvir na porta 443)

Estou basicamente procurando a melhor maneira de configurar o servidor para armazenar em cache todos os uris que não precisam de SSL, pois isso deve ser executado na porta 443. Todos os pedidos da porta 8080 estão indo para o Varnish e funcionando corretamente. Além disso, desejo garantir que a solicitação não SSL seja enviada para domain.com (incluindo solicitações de www). Eu fiz isso antes, mas por algum motivo, o SSL na equação está tornando as coisas complicadas.

Minha configuração é a seguinte:

'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;   
    }

}                       
    
por jnolte 13.08.2012 / 20:32

2 respostas

2

Tente a alocação de portas:

Varnish:80 => NginX:8080
NginX:443

Dessa forma, você passa tudo pelo verniz como camada acima do cache, então o número de pedidos para o NginX é reduzido.

Seu aplicativo deve controlar por meio de cabeçalhos como o conteúdo deve ser armazenado em cache e, por padrão, deve funcionar OK - os arquivos dinâmicos são passados para o NginX enquanto a estática é exibida do cache pelo tempo que o cabeçalho da data de expiração diz.

    
por 13.08.2012 / 22:38
0

É assim que podemos fazer. Eu uso esse padrão para habilitar o SSH para páginas "admin" (no WordPress). Espero que funcione na sua situação.

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;
  }
}
    
por 29.08.2012 / 15:33