かなりゆるーいインフラエンジニアのブログ

zawayaブログ

インフラエンジニアとして活動しています。現場での経験や技術的なことを思ったように書いていきます。

nginxを動かしてみる part1 -初期設定-

1.概要

nginxを自身の環境へインストールし動作させてみたときの備忘録です。
雰囲気で触ることはあったが、改めて復習を兼ねて。

2.実行環境

ubuntu version 18.04 TLS
nginx version: nginx/1.14.0 (Ubuntu) built with OpenSSL 1.1.1 11 Sep 2018

上記サーバはwindows10pro のHyper-V環境で動作。

f:id:blackstar01:20200503021848p:plain

3.各種インストール

nginxのインストールは以下のブログを参考にさせていただきました。

nginxインストール
UbuntuにNginxをインストールする - Qiita

4.nginxの設定

nginxフォルダ構成

   ├ nginx 
       ├ nginx.conf   ※nginxの設定ファイル
       ├ sites-available
       ├      └ example.com ※vhostファイル
       └  sites-enable
              └ example.com (Link) ※vhostのリンク
 var/log
 └ nginx 
    ├access.log      ※アクセスログ
    └error.log ※エラーログ

nginx.confファイルの変更

ほぼデフォルトの設定ですが主要ポイントを記述

コアモジュールの編集

nginxのプロセスの制御を記述するブロック

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

--worker_proccess--
nginxのプロセス数を指定します。 nginxは1プロセスは1スレッドしか利用しないようです。 プロセス数はサーバコア数以下を指定する必要がありますが、autoとしておくことで自動で割り当ててくれます。

イベントモジュールの編集

ユーザーからの接続数を制御するブロックです。

events {
        worker_connections 768;
        # multi_accept on;  #コメントアウト
        multi_accept on; #onに変更
}

--worker_connections--
nginxのプロセスで同時に保持できるコネクション数です。

--multi_accept on--
同時にコネクションを受け付けることができるようになります。onに変更

httpモジュールの編集

ここからが実際のWebサーバ動作に関する記述です。 nginxのhttpモジュールは3つのブロック(http, server, location)で記述しその中にはディレクティブという命令を記述。各ブロックは{}で囲われます。

httpブロック
httpブロックは複数のserverブロックを持つことができ、全体に影響するディレクティブを記述します。
記述した設定はserverブロックで上書きできます。

serverブロック
serverブロックには稼働させるサーバ(仮想ホスト)ごとの固有のディレクティブを記述します。 複数のlocationブロックを持つことができます。

locationブロック
公開するコンテンツパスに適用するディレクティブを記述します。

  • ベースセッティング
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;

特に変更はしていません。
include /etc/nginx/mime.types 内にnginxで扱えるファイルの拡張子が記載されています。この中にないものは.octet-stremとして扱われるようです。

  • SSLセッティング
##
# SSL Settings
##
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  #コメントアウト
ssl_protocols TLSv1.1 TLSv1.2;  #追加
ssl_prefer_server_ciphers on;

--ssl_protocols--
対応するSSLバージョンを指定します。対応するもののみ記述します。TLS1は脆弱なので、無効にしました。

  • ログセッティング
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

ログの変更先を指定します。デフォルトのままです。

  • 圧縮セッティング
##
# Gzip Settings
##

gzip on;

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

レスポンスのコンテンツを圧縮するかの指定です。デフォルトです。

  • 仮想ホストセッティング
##
# Virtual Host Configs
#

#include /etc/nginx/conf.d/*.conf; #コメントアウト
include /etc/nginx/sites-enabled/*;

serverブロックは別のファイルで記述をし、読み込み先を指定するのがスタンダードのようです。 初期状態では読込先(include)が2行書かれており、先に記述してあるものが優先されるので、/etc/nginx/conf.d/*.conf を読み込む指定になっています。現在は、/etc/nginx/sites-enabled/* から読み込むのほうが主流となっているようです。

仮想サーバ設定ファイルを作成

serverブロックを記述したファイルを/etc/nginx/sites-available/フォルダに作成します。今回はexample.comという名前で作成。

server {

       listen 8081 default_server;
       server_name  example.com;
       root /var/www/html/;

       location / {
               index index.html;
       }

       location /page1 {
               root /var/www/html_tmp/;
               index index.html;
       }
       location /page2 {
               root /var/www/html_tmp/;
               index index.html;
       }

}

--listen---
接続を受け入れるIPアドレス、ポートを指定します。 本来の指定としては <ipアドレス>:<ポート>の指定になります。
省略した場合は、ipアドレスは0.0.0.0(すべて)、ポートは80になります。
※例
listen 80 == listen 0.0.0.0:80  (port80で全てのサーバIPで待ち受ける) listen 192.168.1.1 == listen 192.168.1.1:80  (port80で192.168.1.1アドレスで待ち受ける)

--server_name--
サーバ名になります。ここは実際に使用する名前を入れる必要があります。クライアントのhttpリクエストヘッダ内のhost情報を比較し、一致するserverブロックが適用されるためです。 複数のserverブロックを記述しており、どれにも一致しない場合に適用するserverブロックを明示的に指定することが推奨されており、指定するためにはlistenディレクティブにdefault-serverという記述を追加します。

--locationブロック-- 実際に公開するコンテンツパスに対するディレクティブを記述します。 今回は簡単なテストのため、書くパスごとのルートディレクトリ指定と、indexファイルの指定をしています。
http://example.com/page1 or page2 で接続した場合に異なるindex.htmlを返します。

仮想サーバ設定の有効化

作成したexample.comを有効化します。
/etc/nginx/sites-enable/の下にexample.comファイルのリンクを作成します。

ln -s /etc/nginx/sites-available/example.com.com /etc/nginx/sites-enable/example.com
nginx設定ファイルの設定チェック

変更及び作成をした設定ファイルが正しい状態かをチェックする機能が提供されています。

  • 正しい場合
root@ubuntu1804:/etc/nginx# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • 誤りがある場合
root@ubuntu1804:/etc/nginx# nginx -t
nginx: [emerg] unknown directive "sss" in /etc/nginx/sites-enabled/example.com:6
nginx: configuration file /etc/nginx/nginx.conf test failed

5.nginxを起動

  • nginxを再起動し、example.comを有効化します。
systemctl restart nginx.service
  • 起動確認のためホストOSから接続をしてみる

http://<サーバIPアドレス>8081/page1/ に接続。 f:id:blackstar01:20200503042143p:plain

http://<サーバIPアドレス>8081/page2/ に接続。 f:id:blackstar01:20200503123004p:plain

6.nginxの初期設定を終えてみて

特に大きくつまずくところはなく、ちゃんと動いてくれました。初期設定では特に細かな設定は入れていませんので、一般的に利用用途がありそうなアクセス制御機能や認証機能、リバースプロキシ機能などの動作確認をしようと思っています。

7.参考リンク

nginx連載3回目: nginxの設定、その1 - インフラエンジニアway - Powered by HEARTBEATS

nginx ドキュメント 日本語訳