server_compress_and_ssl_report.md
サーバーの応答速度の問題発生で具体的な問題を把握、 その原因である SSL Negotiation までの調査結果書
まずは下記のテストツールで確認、何か問題か把握する
ここで Apache サーバー設定などはどうやってできるか軽く確認しました。
Gzip
圧縮安定したデータを運ぶためには Gzip 圧縮を行うことが大事です。 以下の記事などを参考してください。
-trying to use gzip in order to all data.
.htaccess
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
# Remove browser bugs (only needed for really old browsers)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
</IfModule>
ssh: /usr/local/php5.3/lib/php.ini
output_handler = off
zlib.output_compression = On
zlib.output_handler = ob_gzhandler # 文字化け危険あり
サーバー側のキャッシュを設定することは基本です。 下記の記事でApache サーバー内の設定方法を身につけます。
ssh: /etc/httpd/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so
たまには Gzip がうまく聞かない JS, CSS があります。その時は、
.htaccess
<IfModule mod_rewrite.c>
# Enabling Gzip Compression of CSS, and JS Files Without mod_deflate @AMD Kanazawa
# https://goo.gl/iXzQJy
RewriteEngine On
RewriteRule ^(.*\.js) gzip_handler.php?type=js&file=$1
RewriteRule ^(.*\.css) gzip_handler.php?type=css&file=$1
</IfModule>
gzip_handler.php
<?php
//check that zlib compression is enabled
if(!ini_get('zlib.output_compression')){ die(); }
mb_internal_encoding("UTF-8");
$allowed = array('css','js'); //set array of allowed file types to prevent abuse
//check for request variable existence and that file type is allowed
if(isset($_GET['file']) && isset($_GET['type']) && in_array(substr($_GET['file'],strrpos($_GET['file'],'.')+1), $allowed)){
$data = file_get_contents(dirname(__FILE__).'/'.$_GET['file']); // grab the file contents
$etag = '"'.md5($data).'"'; // generate a file Etag
header('Etag: '.$etag); // output the Etag in the header
// output the content-type header for each file type
switch ($_GET['type']) {
case 'css':
header ("Content-Type: text/css; charset: UTF-8");
break;
case 'js':
header ("Content-Type: text/javascript; charset: UTF-8");
break;
}
// header('Cache-Control: max-age=2592000, must-revalidate'); //output the cache-control header
header('Cache-Control: max-age=2592000'); //output the cache-control header
$offset = 60 * (60 * 24 * 30);
// set the expires header to be 1 hour in the future
$expires = 'Expires: ' . gmdate('D, d M Y H:i:s',time() + $offset) . ' GMT';
header($expires); // output the expires header
// check the Etag the browser already has for the file and only serve the file if it is different
if ($etag == $_SERVER['HTTP_IF_NONE_MATCH']) {
header('HTTP/1.1 304 Not Modified');
header('Content-Length: 0');
} else {
echo $data;
}
}
?>
.htaccess
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
#ExpiresByType text/css "access plus 1 year"
# Data interchange
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rdf+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/ld+json "access plus 0 seconds"
ExpiresByType application/schema+json "access plus 0 seconds"
ExpiresByType application/vnd.geo+json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (cannot be renamed!) and cursor images
ExpiresByType image/vnd.microsoft.icon "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 week"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
# ExpiresByType application/javascript "access plus 1 year"
# ExpiresByType application/x-javascript "access plus 1 year"
# ExpiresByType text/javascript "access plus 1 year"
# ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
# ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
# Manifest files
ExpiresByType application/manifest+json "access plus 1 week"
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Media files
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
</IfModule>
または、
.htaccess
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 month"
ExpiresByType image/jpeg "access 1 month"
ExpiresByType image/gif "access 1 month"
ExpiresByType image/png "access 1 month"
ExpiresByType text/css "access 1 month"
ExpiresByType text/javascript "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType image/x-icon "access 1 month"
ExpiresDefault "access 1 month"
</IfModule>
XHR 要求もキャッシュした方が良いでしょう。 下記の記事を参考してください。
SSL 関連作業は現在進行中です。(ここまでくるのはよっぽどないですが。)
Enable SVG in site SVGを使用するとき
.htaccess
<IfModule mod_mime.c>
# Enable SVG in Site @AMD Kanazawa
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
</IfModule>
Redirect for SPA SPAなどで Redirect
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(ignore_url|other_url)($|/) - [L]
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>