LINEで現役エンジニアに直接質問してみよう!登録無料

Nginxをubuntu linux 18.04へインストールする方法!systemctlを使った操作も少し解説

NginxをUbuntu Linux 18.04にインストールする方法と、Nginxをsystemctlを使って管理する方法を紹介します。

Nginxインストールに必要なもの

  • Ubuntu Linux 18.04がインストールされているサーバー
  • サーバーにアクセスするためのPC
  • SSHが利用できるソフトウェア
  • Webブラウザ

また、サーバー上でNginxの設定ファイルを編集するために「Vimエディタ」も使用します。

Nginxインストールの流れ

  1. Ubuntuのパッケージインデックスファイルを最新にします
  2. UbuntuにNginxをインストールします
  3. UbuntuでNginxを動かして正常にインストールされているかチェック

Ubuntuのパッケージインデックスファイルを最新にします

Ubuntuでなにかソフトウェアをインストールするにはaptコマンドを使います。このコマンドを使うと、Ubuntuコミュニティによって登録されているリポジトリをインストールすることが出来ます。どんなソフトウェアが登録されているかは、「パッケージインデックスファイル」で管理されています。

パッケージインデックスファイルは apt updateで最新バージョンに更新することが出来ます。

nginxをインストール
$ sudo apt update

UbuntuにNginxをインストールします

パッケージインデックスファイルを更新すると、Nginxがインストール出来るようになります。

nginxをインストール
$ sudo apt install nginx
MEMO

何のバージョンのNginxがインストールかはapt search nginxで確認することが出来ます。

この場合、1.14.0-0ubuntu1.2というバージョンがインストールされることがわかります。0ubuntu1.2は、Ubuntuでリポジトリ上、管理のために設定されているだけなので、気にする必要はありません。「Nginx の 1.14.0 がインストールされるんだな」と理解すればOKです。

UbuntuでNginxを動かして正常にインストールされているかチェック

Nginxがインストールされると、自動的に起動します。サーバーのIPアドレスにブラウザからアクセスしてみましょう。

正常にインストール出来、起動しているとこのような画面が表示されます。

これで、Nginxのインストールは完了です。

トラブル: ブラウザで「正常に接続できませんでした」と表示される

この場合、原因は大きく2種類が考えられます。

  1. Nginxが正常にインストール出来ていない
  2. Nginxが起動、または正常に起動していない
  3. Nginxまでデータが届いていない

Nginxが正常にインストール出来ていない

Nginxが正常にインストール出来ているかどうかは、nginxというコマンドが存在するかどうかで確かめることが出来ます。

nginxコマンドの存在を確認
$ which nginx
/usr/sbin/nginx

正常にインストール出来ている場合、/usr/sbin/nginxと表示されます。逆に出来ていない場合は、表示されません。

表示されなかった場合、Nginxのインストール方法をもう一度試してみてください。それでも無理だった場合、専門的な知識が必要になります。ここでは解説しませんので、googleでエラーの内容を検索して見てください。

Nginxが起動、または正常に起動していない

Nginxが起動しているかどうかはsystemctlを使うとわかります。systemctlは、Linuxで使われているデーモンソフトウェアを管理するコマンドです。Nginxもデーモンソフトウェアなので、このコマンドから操作をすることが出来ます。

まず、Nginxが起動しているかどうかはsystemctl status nginxで確認することが出来ます。

nginxのステータスを確認
$ sudo systemctl status nginx
 nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-06-26 13:20:17 UTC; 4min 12s ago
     Docs: man:nginx(8)
  Process: 9675 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 9665 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 9679 (nginx)
    Tasks: 2 (limit: 1154)
   CGroup: /system.slice/nginx.service
           ├─9679 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─9682 nginx: worker process

Jun 26 13:20:17 ip-172-31-41-156 systemd[1]: Starting A high performance web server and a reverse proxy server...
Jun 26 13:20:17 ip-172-31-41-156 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Jun 26 13:20:17 ip-172-31-41-156 systemd[1]: Started A high performance web server and a reverse proxy server.

起動している場合、Active: active (running)と表示されます。逆に、起動していない場合、Active: inactive (dead)と表示されます。

起動していない場合、下記コマンドでNginxを起動させます。

nginxコマンドの存在を確認
$ sudo systemctl start nginx

再度、systemctl status nginxで確認すると、Active: active (running)になっているはずです。

もし、なっていない場合、Nginxの設定ファイルが間違っている可能性があります。

Nginxまでデータが届いていない

Nginxまでデータが届いていない可能性も考えられます。まず、何処までデータが来ているのかを確認する必要があります。そこで、下記項目を実行して問題箇所を特定します

  1. 80番ポートでNginxが起動しているか確認
  2. サーバーのファイヤーウォールを確認
  3. ルーターのファイヤーウォールを確認

80番ポートでNginxが起動しているか確認

:::TODO:::

サーバーのファイヤーウォールを確認

:::TODO:::

ルーターのファイヤーウォールを確認

:::TODO:::

トラブル: コンソールで「Permission denied」と表示される

Nginxの起動で権限が足りない場合に発生するエラーです。

nginxはsudoが必要
$ nginx
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2019/06/26 13:21:36 [warn] 9726#9726: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1
2019/06/26 13:21:36 [emerg] 9726#9726: open() "/var/log/nginx/access.log" failed (13: Permission denied)

Nginxを正常に起動させるには、root権限が必要です。sudoコマンドを使って実行すれば、大丈夫です。

トラブル: コンソールで「Address already in use」と表示される

Nginxが使おうとしているポートが、他のソフトウェアによって既に使われている場合に発生するエラーです。

80番ポートが使われていればエラーになる
$ sudo nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)

この場合、ポートをどのソフトウェアが使っているのかを調べ、それを停止するとこのエラーは発生しなくなります。 どのソフトウェアが使っているのかは、下記で調べることが出来ます。

まず、本当にソフトウェアがポートを使用しているのかを調べます。

ポートを使っているソフトがあるかを調べる
$ netstat -an | grep tcp | grep LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN

ここで、80番ポートが既に使用されていることが分かるので、それが何のソフトウェアによって使われているかを調べます。

ポートをソフトウェア名を調べる
$ sudo lsof -i:80
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   2444     root    6u  IPv4  26561      0t0  TCP *:http (LISTEN)
nginx   2444     root    7u  IPv6  26562      0t0  TCP *:http (LISTEN)
nginx   2447 www-data    6u  IPv4  26561      0t0  TCP *:http (LISTEN)
nginx   2447 www-data    7u  IPv6  26562      0t0  TCP *:http (LISTEN)

どうやら、今回はNginxによって使われているということがわかりました。

この記事を書いた人

自身がプログラミングを独学で勉強し始めて躓いた経験を元に、これから勉強をする人に向けに「イラスト多めでわかりやすい記事」にこだわって情報を発信しています。

現在はフルスタックエンジニアとしてサービス開発などのお仕事をしています。