#はじめに
今回はウェブサーバーの「んぎぃにっくす」の設定を書いていこうと思います。
自己紹介が遅れました、株式会社パーソンリンクに入社して0年目のshiroです。
今回は案件で、rails、docker、nginx、Webpackerの構成で行っており、Nginx.confの設定をしたのでそれについて記載していこうと思います。
Webpackerについてはあまりよろしくない点があるようで現在ははがしています。
詳しくては
https://inside.pixiv.blog/subal/4615
に記載している記事がわかりやすいです
わかりにくい点、不明な点、説明不足な点、間違っている点などある可能性があるので見つけたらそれとなく言ってもらえると嬉しいです。
早速ですが、説明していきます。
user nginx;
processのユーザーを指定する。
masterprocessはrootユーザーになる。
worker_processes auto;
cpuのプロセス数を変更する。
autoで自動で設定してくれる。
CPUプロセス以上にしてもCPUのプロセス数になるので極端な話めちゃくちゃ大きくしても大丈夫(動作自体は未検証です。)
error_log /var/log/nginx/error.log warn;
warn以上のログを出力する場所を指定。
emerg、alert、crit、error、warn、notice、info、debugなどから(この他にもあるかも)
出したいエラーを設定する。
上から重要度が高い。
また、上記で書いてるようにwarnを指定するとそれより上のエラーも出力されるので、「emerg、alert、crit、error、warn」が出力される。
下に行くほどエラーログの内容が多くなる(細かく?)
なら全部出せばいいんじゃない?って思い人がいるかもしれませんが、logの肥大化、重大なエラーを探すのに時間がかかるなどの弊害もあるので、その辺りはいい塩梅のところを選択
worker_connections 1024;
同時接続最大数の設定
これについては1ワーカーの接続最大数ぽいのですがギリギリにすると落ちたりエラーでるっぽいのでマージンを取っておく。
pid /var/run/nginx.pid;
masterプロセスのプロセスIDを保存するファイルを設定します。
http {
proxy_no_cache 1;
proxy_cache_bypass 1;
sendfile off;
server_tokens off;
proxy_no_cacheが1の時はファイルをキャッシュしない。
proxy_cache_bypassが1の時はファイルをキャッシュから探すのを止める。proxy_no_cacheと同じ変数を与えておけば、キャッシュのロードとキャッシュがされなくなる。
server_tokensはバージョンなどを表示しない。これによってバージョン特有の問題など気づかれにくくする。
Nginxを使っていることはわかるので、こまめに攻撃されてしまう可能性があるのでエラーページを見せなくする方がいいのかもしれない
underscores_in_headers on;
名前にアンダーバーつけても読み取れるように変更する
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
ログ出力などの設定。
include /etc/nginx/mime.types;
mime.typesを読み取れるようにする。
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/x-javascript js;
application/atom+xml atom;
application/rss+xml rss;
などが入っている。
参考:https://heartbeats.jp/hbblog/2012/02/nginx03.html
default_type application/octet-stream;
レスポンスのデフォルトMIMEタイプを設定。
# パケット数と送信量を増やすことができます。
tcp_nodelay on;
送信済みデータの応答待ちの状態でも遅延させることなくデータ送信できるようにする機能
gzip on;
gzipを有効にする
gunzip on;
gzip未対応の時にgunzipを使う
keepalive_timeout 65;
タイムアウトの時間設定
client_max_body_size 4G;
nginxが受け付ける最大のbodyサイズを設定します
root /プロジェクト名/public;
ドキュメントルート設定
# try_files $uri/index.html $uri @unicorn;
# try_files $uri $uri/;
upstream unicorn {
# server web_app:3000 fail_timeout=30;
# server unix:/var/run/unicorn.sock fail_timeout=0;
server web_app:3000 fail_timeout=0;
}
server {
listen 80;
server_name *.ドメイン名
# 処理しているサーバ名 request_uriクライアントから受け取ったオリジナルのリクエストURI
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name *.ドメイン名;
try_files $uri $uri.html $uri/index.html @unicorn;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/〜.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location @unicorn {
expires -1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass_request_headers on;
proxy_pass http://unicorn;
}
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;
}
このあたりの設定は以下のサイトの方がわかりやすいので割愛
https://qiita.com/kaikusakari/items/cc5955a57b74d5937fd8
わかりにくい部分があったと思いますが、都度質問してもらえると嬉しいです。
明日は、心優しい私のメンターである@Katoshuuuさんに担当していただきます。
最後まで読んで頂き、ありがとうございました。
あ、念の為に言っておきますけどnginxの読みはエンジンエックスと読むので、タイトルのように読まないでくださいね!
間違っている点で指摘して頂けたらなと思います
その他全体的に参考にしたサイト
http://nrok81.hatenablog.com/entry/2014/11/12/191240
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_no_cache