• 追加された行はこの色です。
  • 削除された行はこの色です。
ネットワーク > [[Webサーバー]] > NginxをUbuntuにインストール
#norelated
#contents

NginxをUbuntuにインストールする方法のまとめです。
※CentOSにインストールする場合は[[Nginx]]のページを参照してください。

* [#w88b367a]
* リンク [#l9ee8791]
- 公式サイト(英語)
https://nginx.org/
- wiki(英語)
https://www.nginx.com/resources/wiki/
- forum(英語)
http://forum.nginx.org/
-Nginx情報(日本語訳)
http://mogile.web.fc2.com/nginx/
http://mogile.web.fc2.com/nginx/admin-guide/

* 参考書 [#e8040f18]
#html{{
<table border="0" cellpadding="5"><tr><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4048702270/vertex9-22/" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51xpswg%2BkkL._SL160_.jpg" border="0"></a></td><td> </td><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4048702270/vertex9-22/" target="_blank">ハイパフォーマンスHTTPサーバ Nginx入門</a><br>Clement Nedelcu<br>アスキー・メディアワークス<br>2011-04-21<br>¥ 3240</td></tr></table>
}}

* インストール(Ubuntu編) [#qf24157e]
UbuntuをCentOSにソースコードからコンパイルして、手動でインストールする手順のまとめ
-(参考)nginx ソースファイルからのインストール(Ubuntu) https://gakumon.tech/nginx/nginx_install_src_ubuntu.html

** ログイン [#w5e3939a]
Ubuntuにログインします。

** ダウンロード [#o339bdaa]
''Nginx最新安定版(stable)を公式サイトからダウンロードします。''

+ Nginx最新安定版のバージョンを公式サイトで確認します。
https://nginx.org/en/download.html
 (例) Stable version nginx-1.14.2
+ 作業ディレクトリ(tmp)に移動します。
 $ cd /tmp
+ 圧縮ファイルをダウンロードします。
 $ wget https://nginx.org/download/nginx-1.14.2.tar.gz
(wgetコマンドがインストールされていない場合は、「$ sudo apt-get install wget」)
+ ダウンロードしたファイルを解凍します。
 $ tar zxf nginx-1.14.2.tar.gz
+ カレントディレクトリを移動します。
 $ cd nginx-1.14.2

** コンパイル [#v4b57607]
+ Nginx用の[[システムユーザー]]を作成します。
 $ sudo adduser --system --no-create-home --shell /bin/false --group --disabled-login nginx
Adding system user `nginx' (UID 111) ...
Adding new group `nginx' (GID 116) ...
Adding new user `nginx' (UID 111) with group `nginx' ...
Not creating home directory `/home/nginx'.
+ Nginxに必要なライブラリをインストールします。
(例では、必須ライブラリの他にHTTPSのコンテンツを処理するOpenSSLライブラリもインストールしています。)
 $ sudo yum install gcc
 $ sudo yum install pcre pcre-devel
 $ sudo yum install zlib zlib-devel
 $ sudo yum install openssl openssl-devel
+ 使用するオプションを付けてconfigureを実行します。
 $ ./configure --prefix=/usr/local/nginx-1.2.6 --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module
+ コンパイルして、インストールします。
 $ make
 $ sudo make install

** シンボリックリンクの作成 [#b778e349]
+Nginxをバージョンアップするごとに異なるprefixを指定するので、変更をやりやすくするために、prefixのディレクトリを指すシンボリックリンクを作成します。
 ln -s /usr/local/nginx-1.2.6 /usr/local/nginx

* 自動起動スクリプト [#t5fb789b]
''Nginxをソースからインストールした場合は、起動スクリプトが作成されないので自作します。''

+ /etc/init.dにnginxのプログラム起動スクリプトのファイルを作成します。
 # vi /etc/init.d/nginx
+ ファイル内容は、以下のようにします。
 #!/bin/sh
 #
 # nginx - this script starts and stops the nginx daemon
 # cf. http://www.happytrap.jp/blogs/2012/02/23/8243/
 #
 # chkconfig:   - 85 15
 # description:  Nginx is an HTTP(S) server, HTTP(S) reverse
 #               proxy and IMAP/POP3 proxy server
 # processname: nginx
 
 # Source function library.
 . /etc/rc.d/init.d/functions
 
 # Source networking configuration.
 . /etc/sysconfig/network
 
 # Check that networking is up.
 [ "$NETWORKING" = "no" ] && exit 0
 
 nginx="/usr/local/nginx/sbin/nginx"
 prog=$(basename $nginx)
 
 NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
 
 lockfile=/usr/local/nginx/logs/nginx.lock
 
 start() {
     [ -x $nginx ] || exit 5
     [ -f $NGINX_CONF_FILE ] || exit 6
     echo -n $"Starting $prog: "
     daemon $nginx -c $NGINX_CONF_FILE
     retval=$?
     echo
     [ $retval -eq 0 ] && touch $lockfile
     return $retval
 }
 
 stop() {
     echo -n $"Stopping $prog: "
     killproc $prog -QUIT
     retval=$?
     echo
     [ $retval -eq 0 ] && rm -f $lockfile
     return $retval
 }
 
 restart() {
     configtest || return $?
     stop
     sleep 1
     start
 }
 
 reload() {
     configtest || return $?
     echo -n $"Reloading $prog: "
     killproc $nginx -HUP
     RETVAL=$?
     echo
 }
 
 force_reload() {
     restart
 }
 
 configtest() {
     $nginx -t -c $NGINX_CONF_FILE
 }
 
 rh_status() {
     status $prog
 }
 
 rh_status_q() {
     rh_status >/dev/null 2>&1
 }
 
 case "$1" in
     start)
         rh_status_q && exit 0
         $1
         ;;
     stop)
         rh_status_q || exit 0
         $1
         ;;
     restart|configtest)
         $1
         ;;
     reload)
         rh_status_q || exit 7
         $1
         ;;
     force-reload)
         force_reload
         ;;
     status)
         rh_status
     ;;
     condrestart|try-restart)
         rh_status_q || exit 0
             ;;
     *)
         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
         exit 2
 esac
+ 起動スクリプトに実行権限を付与します。
 $ sudo chmod +x /etc/init.d/nginx 
+ 自動起動の設定をします。
 $ sudo chkconfig --add nginx
 $ sudo chkconfig nginx on
これで、serviceコマンドでも起動・終了・再起動が実行できるようになります。
+ 自動起動の設定(ランレベル)を確認します。
 $ sudo chkconfig --list nginx
これで、
''nginx  0:off  1:off  2:on  3:on  4:on  5:on  6:off''
と表示されたらOKです。

* 基本操作 [#bbd40afa]
- 設定ファイルの文法チェック
 $ sudo service nginx configtest

- 起動
 $ sudo service nginx start

- 終了
 $ sudo service nginx stop

- 再起動
 $ sudo service nginx restart

* バーチャルホストの設定 [#u9850fc8]
-(参考)
nginx の バーチャルホスト設定 - hogeskyの日記
http://d.hatena.ne.jp/hogesky/20120416/1334588838

>''バーチャルホスト設定ファイルの置き場を作る''
バーチャルホストの設定は、nginx のインストールディレクトリにある nginx.conf に記述する。
このファイルに各ドメインの設定をそのままベタ書きしてもいいのだけど、そうすると管理が煩わしくなるので、ドメインごとに設定ファイルを作り、nginx.conf から読み込ませるようにする。
 
まず、nginxのインストールディレクトリにドメイン毎の設定ファイルを収めるディレクトリを作る。
 sudo mkdir /usr/local/nginx/sites-available
 sudo mkdir /usr/local/nginx/sites-enabled
Apache2 風の構成。
&color(red){sites-available にドメイン毎の設定ファイルを置き、sites-enabled からシンボリックリンクを張り、nginx.conf からは sites-enabled を読み込ませるようにする。};
こういうふうにしておくメリットは、いくつかある。
 
・バーチャルホストの使用/不使用を簡単に切り替えられる。
・あるドメインの利用を一時的に止めるときは、単にシンボリックリンクを削除するだけで済むし、再開するときはリンクを作り直すだけでいい。
・あるドメインが別のサーバに引越す際に、設定ファイルをそのまま持ち越せる。
・ドメイン毎に設定ファイルが分かれているため、編集失敗の影響が他に及びにくい。
 
ディレクトリを作ったら、nginx.conf の httpセクションに次の1行を加える。 
 include /usr/local/nginx/sites-enabled/*;
記述場所は、33行目の「#gzip on;」の後あたりが分かりやすい。(serverセクションの中に入れてはいけない。)

なるほど~!(・∀・)
+ Ubuntu+Apache2風のフォルダを用意して、バーチャルホストの設定ファイルの置き場所にする。
+ バーチャルホストの設定(「server」セクションの部分)を、別ファイルに切り出して置く。
+ シンボリックリンクで、バーチャルホストの稼動状態を切り替える。

バーチャルホストの数が少なくて、手動で管理するなら、この手法で十分でしょう。
(=もっと多くなったら、RDBを使って管理した方が良い?)

上記の方法をちょっと手直しするなら、自分の環境だと、「/usr/local/nginx」自体がシンボリックリンクになっているので、バーチャルホストの設定ファイル置き場は、「home」ディレクトリーに「nginx」というユーザーのディレクトリーを作り、そこの置くとかが良いかな?

 # cd /home
 # mkdir nginx
 # chown nginx:nginx nginx
 # chmod 0700 nginx

 # ls -la
 drwx------   2 nginx  nginx  4096 Jul 14 15:06 nginx

 # mkdir /home/nginx/conf/sites-available
 # mkdir /home/nginx/conf/sites-enabled

 # vi /usr/local/nginx/conf/nginx.conf
 include /home/nginx/conf/sites-enabled/*;
というかんじでOK。

** バーチャルホストの設定ファイルを手動で管理 [#vb1bc0ce]
(Linuxコマンドの復習)

- コピー
file1をfile2というファイルとして複製
 $ cp file1 file2

- シンボリック・リンク
シンボリック・リンクは、リンク先へのショートカットファイル
 $ ln -s リンク元 リンク先

** 作業例 [#ecf9739d]
- /home/nginx/conf/sites-available ← サブドメインの設定ファイルの本体を置く
- /home/nginx/conf/sites-enabled ← 設定ファイルのシンボリックリンクを置く
シンボリックリンクの作成/削除で稼動状態を切り替えられる。
=シンボリックリンクを削除すればサブドメインを停止できる。

*** (1) サブドメインの設定ファイルを作成 [#f5a0a741]
 $ su ← サーバー管理者になる
 $ cd /home/nginx/conf/sites-available
 $ cp virtualhost_template.conf virtualhost_subdomain.conf ← テンプレートをコピーする
 $ chown nginx:nginx virtualhost_subdomain.conf ← 属性を変更する
 $ vi virtualhost_subdomain.conf ← 設定ファイルの中身を編集する

*** (2) シンボリックリンクを作成 [#pdf6a32c]
ln -s リンク元 リンク先
 $ ln -s /home/nginx/conf/sites-available/virtualhost_subdomain.conf /home/nginx/conf/sites-enabled/virtualhost_subdomain.conf

*** (3) ディレクトリーの作成 [#z2d02504 Gateway Time-out が出た際は Elastic Load Balancing の設定にも注意しよう - Qiita http://qiita.com/kotarella1110/items/169ddcef03983f5d64b2927] [#o7116772]
 $ cd /…/public_html/ ←Web用の公開ディレクトリーへ移動
 $ mkdir subdomain
 $ chown nginx:nginx subdomain ← subdomainを利用する作業用ユーザー名(例:nginx)に合わせる

*** (4) Nginxを再起動 [#e9832872]
 $ service nginx configtest ← 設定ファイルの文法チェック(念のため。エラー出たら中身を確認)
 $ service nginx restart ← 再起動

//////////////////////////////////////////////////////////////////////////
* 504 Gateway Time-out の解決策 [#maeb3316]
Nginxの設定ファイルを編集して、serverセクションにあるfastcgi_read_timeoutの秒数を増やせば、504 Gateway Time-outが解決するみたいです。

+ サーバー側の処理時間がやけに長いなーと思って確認したら、MySQLで処理が重たい所があった!
+ 根本的にはMySQLのインデックスをチューンナップしたりしないといけない。→EXPLAINでINDEXの効果を確認する。
+ 欲張って、余計なINDEXを張っていたら、INSERT時にINDEXデータの追加で時間を食っていたみたい?

(参考)
- KB Plesk: Nginx 504 タイムアウトエラー 
https://kb.plesk.com/jp/120210

- nginx でupstream timed outエラーが発生した時の対処 | レンタルサーバー・自宅サーバー設定・構築のヒント 
http://server-setting.info/centos/nginx-upstream-timed-out.html

- 504 Gateway Time-out が出た際は Elastic Load Balancing の設定にも注意しよう - Qiita 
http://qiita.com/kotarella1110/items/169ddcef03983f5d64b2

- Winux/Lindows |Nginx+php-fpmで502とか504とかのエラーをなんとかしよう 
http://mypace75.blog92.fc2.com/blog-entry-992.html

>解決方法
結論的にはNginxの設定ファイルでserverセクションに fastcgi_read_timeout 1000; とか追記したら行けるようになりました。

→1000秒(16分40秒)もかかる処理って、どんだけwww

 server {
 	listen       80;
 	server_name  example.com;
 	access_log   /var/log/nginx/access.log main;
 	error_log    /var/log/nginx/error.log info;
 	root         /var/www/nginx;
 
 	# デフォルト 60秒を120秒までアップします。
 	fastcgi_read_timeout 120;  
 	...
 }

- php-fpm+nginxで「504 Gateway Time-out」が出た時の対処法 - oneのはてなダイアリー 
http://eno0514.hatenadiary.jp/entry/20150614/1434228237

 最初に試してほしい対処法は処理の実行時間を延ばすことです。
 必要な設定は以下の3つになります。
 
 • php.ini
 max_execution_time = 180
  
 • php-fpm.conf
 request_terminate_timeout 180
  
 • nginx.conf
 fastcgi_read_timeout 180

単純に解決しない場合は、Nginxの他に、PHPやPHP-FPMの設定など、他の場所も確認する必要もありそうですね。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS