使用 nginx/varnish 处理 SSL 和非 SSL 页面

使用 nginx/varnish 处理 SSL 和非 SSL 页面

免责声明:我已将这个问题发布在 Stackoverflow 上,因为我认为它可能更适合那里。如果有人想在那里回答,问题的链接如下。

--

我有以下内容:

domain.com - 许多 URL 不需要 SSL(我想使用 Varnish 来缓存所有这些 URL)domain.com/shop - 所有 URL 都应该使用 SSL(不需要 Varnish,我想监听 443 端口)

我基本上是在寻找配置服务器的最佳方式,以缓存所有不需要 SSL 的 uri,因为这必须在端口 443 上运行。所有端口 8080 请求都将发送到 Varnish 并正常工作。此外,我想确保将非 SSL 请求发送到 domain.com(包括 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;   
    }

}                       

答案1

尝试端口分配:

Varnish:80 => NginX:8080
NginX:443

这样,您将所有内容都通过 varnish 作为缓存层,因此对 NginX 的请求数量就会减少。

您的应用程序应该通过标头控制如何缓存内容,默认情况下它应该可以正常工作 - 动态文件被传递给 NginX,而静态文件则从缓存中提供,持续时间与标头所说的有效期相同。

答案2

我们可以这样做。我使用此模式为“管理”页面启用 SSH(在 WordPress 中)。希望它能适用于您的情况。

服务器 {
  听 8080;
  服务器名称域名.com;
  根/路径/到/域名.com/安装;
  索引索引.php;

  位置 ~ \.php$ {
    # 请求通过 HTTPS 访问 /shop
    位置 ~ /商店 {
      返回 301 https://$host$request_uri;
    }

    # 处理非 /shop PHP 请求
    尝试文件$uri =404;
    包括 fastcgi_params;
    fastcgi_index索引.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/dev/shm/php-fpm-www.sock;
  }

  地点 / {
    尝试文件$uri $uri/ /index.php;
  }

}

服务器 {
  听443 ssl;
  服务器名称域名.com;

  ssl_证书xyz.crt;
  ssl_certificate_key xyz.key;

  根/路径/到/域名.com/安装;
  索引索引.php;

  # 仅处理购物请求
  位置 ~ /商店 {
    位置 ~ \.php$ {
      尝试文件$uri =404;
      包括 fastcgi_params;
      fastcgi_index索引.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_pass unix:/dev/shm/php-fpm-www.sock;
      fastcgi_param HTTPS 开启;
    }
  }

  # 将其他所有内容重定向到端口 80 (Varnish)
  地点 / {
    返回 301 http://$host$request_uri;
  }
}

相关内容