首页 > HTTPS环境下phpMyAdmin一个很奇怪的问题

HTTPS环境下phpMyAdmin一个很奇怪的问题

今天给我自己的VPS配置上了SSL证书,于是想把phpMyAdmin的强制SSL打开,可是打开之后发现一个很奇怪的问题,具体描述如下:

  1. 首页完全是空白
  2. 首页的源代码是有内容的,而且是正确的
  3. Chrome的开发者控制台能看到所有的CSS、JS请求全挂了。(failed) Pending
  4. 双击打开这些请求,可以完全正常的看到所有的CSS和JS
  5. 从日志可以看出客户端完全没有发起对那些没有加载的CSS和JS的请求。

请问这样的问题该如何解决呢。。。

个人认为与

<style>html{display: none;}</style>

没有直接的关系。因为http下加载了所有的CSS之后,会有新的CSS覆盖着一条,所以可以正常显示。如果在HTTPS下,由于某些CSS无法正常加载,才导致了这一条直接生效,导致页面全白。

应要求贴上httpd的ssl配置。

Listen 443
SSLPassPhraseDialog  builtin
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /***/ssl.crt
SSLCertificateKeyFile /***/ssl.key
SSLCertificateChainFile /***/gs_intermediate_ca.pem
SSLCACertificateFile /***/ca.pem
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

在@HJin.me 的提醒下找到一点头绪,确实是SPDY的问题。如果把SPDY关掉,那就完全正常。但是还木有找到最终的原因。

然后多次试验发现了一个更加奇怪的问题。有的时候我在服务端日志上完全看不到访问记录,说明Chrome的请求完全没有发到服务端。但是有的时候,我能在服务端看到请求到达,并且返回200,可是Chrome依然显示(failed) Pending。但是这时候如果点一下这个请求,会发现右边打开的窗口中显示的HTTP状态码是200!这真是太奇怪了。。。


因为你所有的静态资源CSS和JS走的都是http端口,chrome会认为这是不安全因素,所以默认不加载它们。你需要设置让静态资源也走https,具体在哪设置我还没找到,不过应该就是这个原因。


更新下: 我在html代码里发现了这样一句

<style>html{display: none;}</style>

所有的样式都隐藏了,当然显示不出来


可能你的问题早就解决了,不过我刚好遇到一个相同的问题,所以顺便跟一下这个问题。(可能答不对题了,因为我用的是nginx,而且js并没load失败,答案留作一种相关参考吧)

现象

  1. 突然就不能访问了(实际是空白页面,而且其实找到原因后发现并是不突然的)
  2. 服务端无PHP Error
  3. 所有http请求都正常,status code 200
  4. 查看页面源代码感觉都正常,HTML加载完整

经历

  1. 我也发现<style>html{display: none;}</style>这个奇怪的样式了,第一反应式被注入了,很快发现,这个是phpmyadmin本身的作法,问题不在这里
  2. 重启php-fpm和nginx,这属于简单易行,瞎猫碰上死耗子的办法。结果:无效果
  3. 再次通过firebug分析,发现有JS错误,发现JS都是通过php输出加载的。难道JS代码本身有问题?下载一个最新的phpMyAdmin覆盖安装。结果:无效果
  4. 继续分析JS错误,单独打开/js/get_scripts.js.php请求,终于发现问题:内容输出不完整。正是因为JS的内容输出不完整,导致后续一系列JS错误,页面样式也就无法正常设置了。
  5. 查看nginx错误日志,发现如下错误:
2013/12/19 04:10:26 [crit] 21911#0: *65059 open() "/usr/local/server/nginx/fastcgi_temp/3/58/0000001583" failed (13: Permission denied) while reading upstream, client: 1.93.255.38, server: mysql.samoay.me, request: "GET /js/get_scripts.js.php?token=a08a84b3c2426dcb913c79cc112...

问题原因

Nginx的fastcgi_temp目录权限错误,nginx子进程(worker process; master进程是root账户下运行的,但是所有的worker进程是根据nginx配置文件的user账户下运行的)无法进行写入。我突然想起来不久前曾经改过目录权限。

问题解决

知道了原因解决就简单了,我的nginx user配置是www:www,改下fastcgi_temp目录权限就好了:

chown -R www:www ./fastcgi_temp

深入理解

Nginx有一个buffer机制,对于来自FastCGI服务的Response,Nginx将其缓冲到内存中,然后依次发送到客户端浏览器。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制,当FastCGI的返回内容的大小在buffer限制之内的,会写入内存,然后发送到客户端;但是超过之后,就会写入磁盘缓存,写入的目录就是fastcgi_temp目录。这个目前无法写入的话,导致nginx无法继续缓冲FastCGI的返回,最终只将内存中缓冲的部分数据输出到了客户端。稍后写一篇博文详细总结一下相关问题。

【热门文章】
【热门文章】