LetsEncrypt使ってSSL対応して、FuelPHPを使ったサイトのnginx.conf

Googleにスパム認定されちゃったw

相当前に作ったものをメンテして放置してて、
トラフィックは右肩あがりだったんですが
とうとう手動でスパム扱いされました。
もう1月の末の話ですが、、、w

今回のドメインはGoogle検索にはひっかかりませんw
とりあえず動きはしてるので、
せどりで海外のAmazonとかの価格比較したい人は使えるかもー。

まあ作ったものに対してconfぐらいは
SSL対応とかHTSTとかで調べる人いるかもしれないので
ついでに公開しておきます。

当時共通化したいなーと思ってたところだけ
共通化してconf作ってました。

コピーしてドメインと変数だけ変えたら別サイト展開って感じにしてます。
さらに面倒なところを自動化して
最近のはもっとはしょって最適化したものを
includeしてるんですが、
もう書いちゃったので
見る人が多いかまた時期がきたら載せます。

/etc/nginx/nginx.conf

全体に適用されるnginx.conf
gzipとSSL系の設定を入れてます。
一応理解した上で反映しましょう。

わかったものから追記すると良いと思います。

websocket用はまあ使わないでしょうね。

redirect/*.confの
301用のリダイレクト用のconfもありますが、
(80ポートでアクセスした場合に443に飛ばす)
載せるとキリがないので飛ばしてます。

listen 80で
ドメイン書いて301でschema変えて飛ばすだけですね。
欲しい人は言ってください。のせます。

user  nginx;
worker_processes 1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    use epoll;
    worker_connections  65535;
    multi_accept on;
}

### for fusion IO ###
#http {

    ### google DNS
#    resolver 8.8.8.8;

#    server {
#        listen 8080;
#        server_name localhost;
#        location / {
#            proxy_pass $scheme://$http_host$request_uri;
#        }
#    }

#}

http {
    server_names_hash_bucket_size 256;
    server_tokens off;
    sendfile       on;
    tcp_nodelay    on;
    tcp_nopush     on;
    keepalive_timeout 15;
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 100;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format  ltsv "time:$time_local"
                     "\thost:$remote_addr"
                     "\tuser:$remote_user"
                     "\tscheme:$scheme"
                     "\tmethod:$request_method"
                     "\turi:$request_uri"
                     "\tprotocol:$server_protocol"
                     "\treq:$request"
                     "\tstatus:$status"
                     "\tsize:$body_bytes_sent"
                     "\treferer:$http_referer"
                     "\tua:$http_user_agent"
                     "\tforwarded_for:$http_x_forwarded_for"
                     "\treqtime:$request_time"
                     "\tdevice_type_id:$sent_http_device_type_id"
                     "\tplatform_id:$sent_http_platform_id"
                     "\tuser_id:$sent_http_user_id"
                     "\tvhost:$host"
                     "";

    openssl dhparam -out dhparam.pem 2048
    ssl_dhparam /etc/nginx/dhparam.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #ssl_protocols TLSv1.1 TLSv1.2;

    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    ssl_prefer_server_ciphers on;

    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    gzip on;
    gzip_http_version 1.0;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_types      text/plain text/css application/json application/x-javascript text/xml application/xml application/atom+xml text/javascript application/javascript;
    gzip_disable "msie6";

    open_file_cache max=100000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

    # websocket用
    map $http_upgrade $connection_upgrade {
      default upgrade;
      ''      close;
    }
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/conf.d/redirect/*.conf;
}

/etc/nginx/conf.d/ys-shop.conf

サブドメインごとに設定いれまくってるんですが、
さすがにドメインごとにディレクトリわけないと管理が煩雑になるので、
ドメインごとにconfを作ってdirectoryでわけてます。

include /etc/nginx/conf.d/ys-shop/*.conf;

/etc/nginx/conf.d/ys-shop/ys-shop.biz.conf

includeしてる部分はSSLが無料で使えるようになってる時代なので
SSL用のファイルを読み込んでます。
access_logはltsv使ってます。

phpの設定の部分は毎回書くのめんどくさいのですが、

fastcgi_param DEFAULT_CONTROLLER amazon/jp

アプリ内部でENVの値でサイトを切り分けてるのでこういう風に設定してます。

毎回書くものに対して
includeは使えますねー。

複数の言語展開とかしまくったサイトなので、
ドメイン別にnginxから変数渡して使ってます。

server {
    server_name  ys-shop.biz;
    server_name  ja.ys-shop.biz;
    include /etc/nginx/conf.d/ssl/ys-shop.biz.conf;
    # 昔使ってたURLのパラメータをリダイレクト
    rewrite ^/amazon/product/detail/(.*?)\.html$ https://ys-shop.biz/product/$1 permanent;

    root /var/www/affiliate/public/;
    index index.php index.html;

    access_log  /var/log/nginx/access.log ltsv;
    error_log  /var/log/nginx/error.log;

    location = /robots.txt {
        rewrite ^/robots\.txt$ /robots last;
        allow all;
    }

    # すべてのアクセスをindex.phpに振ります。
    location / {
        add_header Access-Control-Allow-Origin "$http_origin";
        add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
        add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
        add_header Access-Control-Allow-Credentials true;
        add_header Vary 'User-Agent';

        try_files $uri /index.php?$uri&$args;
    }

    location ~ \.php$ {
        fastcgi_param  FUEL_ENV production;
        fastcgi_param  DEFAULT_CONTROLLER amazon/jp;
        include /etc/nginx/conf.d/common/php.conf;
    }
}

/etc/nginx/conf.d/ssl/ys-shop.biz.conf

letsencryptを使って無料のSSL使ってます。

include /etc/nginx/conf.d/ssl/common.conf;
ssl_certificate /etc/letsencrypt/live/ys-shop.biz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ys-shop.biz/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/ys-shop.biz/chain.pem;

/etc/nginx/conf.d/common/php.conf

HSTSを有効にしてます。
基本的にSSLしか受け付けないようにしてるんで、
以下の設定をいれます。

HSTSについては調べてみましょう。
ググればすぐ出てきます。

if ($scheme = "https") {
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
#    add_header Strict-Transport-Security "max-age=0;";
    add_header Access-Control-Allow-Origin "$http_origin";
    add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
    add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
    add_header Access-Control-Allow-Credentials true;
    add_header Vary 'User-Agent';
}

add_header Access-Control-Allow-Origin "$http_origin";
add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
add_header Access-Control-Allow-Credentials true;
add_header Vary 'User-Agent';

fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include        fastcgi_params;

#fastcgi_cache         fastcgi;
#fastcgi_cache_valid   200 10m;
#fastcgi_cache_valid   404 1m;

/etc/nginx/conf.d/ssl/common.conf

あるあるな443ポートの設定。
session系のtimeoutとかの設定と共通で
botがきたら403返すようにしてるけれど
なくてもいいです。

listen 443 ssl spdy;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

if ($http_user_agent ~* (XoviBot|BLEXBot|MegaIndex) ) {
   return 403;
}
# sitemapの書き出しURLミスってたからリダイレクト
rewrite "^/sitemap/product/[a-z0-9]+?([a-z0-9]{40})$" $scheme://$server_name/product/$1 permanent;

ということで

ペタッと貼り付けただけなので、
軽いミスとかは許してくださいw

nginxはmainline使ってます。

雑すぎてないと思うけど
何か質問とかあれば@yoshikidsまで

  • このエントリーをはてなブックマークに追加