Windowsへnginx 1.8をインストールしたときのメモ

# 概要

Windows環境にchocolateyを使ってnginx 1.8をインストールしたときのメモです。

**環境**

* Windows7 (64bit)
* [chocolatey] (https://chocolatey.org/) 0.9.9.11
* [nginx] (https://chocolatey.org/packages/nginx) 1.8

**参考**

* [nginx for Windows] (http://nginx.org/en/docs/windows.html)

## nginxのインストール

```bat:install
> choco install nginx
Installing the following packages:
nginx
By installing you accept licenses for the packages.

nginx v1.8.0
The package nginx wants to run 'chocolateyInstall.ps1'.
Note: If you don't run this script, the installation will fail.
Note: To confirm automatically next time, use '-y' or consider setting
 'allowGlobalConfirmation'. Run 'choco feature -h' for more details.
Do you want to run the script?
 1) yes
 2) no
 3) print
1

...省略...

 C:\ProgramData\chocolatey\lib\nginx\tools
 ShimGen has successfully created a shim for nginx.exe
 The install of nginx was successful.

Chocolatey installed 1/1 package(s). 0 package(s) failed.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
```

### version

```bat:version
> nginx -v
nginx version: nginx/1.8.0
```

大文字Vはビルド時のconfigureを確認することができます。下記の内容は見やすいように改行をしています。

```bat:version
> nginx -V
nginx version: nginx/1.8.0
built with OpenSSL 1.0.1m 19 Mar 2015
TLS SNI support enabled
configure arguments:
--with-cc=cl
--builddir=objs.msvc8
--with-debug
--prefix=
--conf-path=conf/nginx.conf
--pid-path=logs/nginx.pid
--http-log-path=logs/access.log
--error-log-path=logs/error.log
--sbin-path=nginx.exe
--http-client-body-temp-path=temp/client_body_temp
--http-proxy-temp-path=temp/proxy_temp
--http-fastcgi-temp-path=temp/fastcgi_temp
--http-scgi-temp-path=temp/scgi_temp
--http-uwsgi-temp-path=temp/uwsgi_temp
--with-cc-opt=-DFD_SETSIZE=1024
--with-pcre=objs.msvc8/lib/pcre-8.35
--with-zlib=objs.msvc8/lib/zlib-1.2.8
--with-select_module
--with-http_realip_module
--with-http_addition_module
--with-http_sub_module
--with-http_dav_module
--with-http_stub_status_module
--with-http_flv_module
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_auth_request_module
--with-http_random_index_module
--with-http_secure_link_module
--with-mail
--with-openssl=objs.msvc8/lib/openssl-1.0.1m
--with-openssl-opt=enable-tlsext
--with-http_ssl_module
--with-mail_ssl_module
--with-ipv6
```

### コマンド

*起動*

```bat:start
> start nginx
```

上記のコマンドでnginxを起動すると、コンソールが立ち上がりますが、nginxを停止させるつもりでコンソール上で<kbd>Ctrl</kbd> + <kbd>C</kbd>を押してコンソールを閉じてもnginxは起動されたたままです。停止させるには下記のコマンドを実行する必要があります。

*停止*

```bat:stop
> nginx -s stop
```

*help*

```bat:help
> nginx -h
nginx version: nginx/1.8.0
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: NONE)
  -c filename   : set configuration file (default: conf/nginx.conf)
  -g directives : set global directives out of configuration file
```


### 実行環境構築

#### ディレクトリ

```text
D:\dev\nginx
  ├─ \conf
  ├─ \html
  ├─ \logs
  ├─ \temp
  ├─ server_start.bat
  └─ server_stop.bat
```

*conf*

chocolateyでインストールしたディレクトリ(`C:\ProgramData\chocolatey\lib\nginx\tools\nginx-1.8.0`)にあるconfをディレクトリごとコピーします。

*html*

htmlディレクトリを作成します。
ここがnginxのドキュメントルートになります。

*logs*

logsディレクトリを作成します。

*temp*

chocolateyでインストールしたディレクトリ(`C:\ProgramData\chocolatey\lib\nginx\tools\nginx-1.8.0`)にあるtempをディレクトリごとコピーします。

#### conf/nginx.conf

デフォルトのままでも動作します。
今回はコメントされていたlog_formatとaccess_logのディレクティブを有効にしました。

```text
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  logs/access.log  main;
```

##### confファイルのテスト

confを編集した場合はsyntaxチェックを行って設定に間違いがないか確認することができます。

```bat:syntax_check
> nginx -t
nginx: the configuration file D:\dev\nginx/conf/nginx.conf syntax is ok
nginx: configuration file D:\dev\nginx/conf/nginx.conf test is successful
```

#### 実行・停止用のbat

```bat:server_start.bat
start nginx
```

```bat:server_stop.bat
nginx -s stop
```


### nginxでphpMyAdmin

#### phpのインストール

https://secure.php.net/

Windowsでphpを実行するには別途、Visual Studio 2012 Visual C++ 再頒布可能パッケージが必要になります。
[https://www.microsoft.com/ja-JP/download/details.aspx?id=30679] (Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ)

*Version*

```bat
> php -v
PHP 5.6.17 (cli) (built: Jan  6 2016 13:28:21)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
```

*php.ini*

php.ini-developmentをphp.iniにリネームして下記の箇所を修正します。(抜粋)

```text
extension_dir = "D:\dev\php-5.6.17\ext"
extension=php_mbstring.dll
extension=php_mysql.dll
extension=php_mysqli.dll
date.timezone = "Asia/Tokyo"
```

#### phpMyAdminのインストール

https://www.phpmyadmin.net/

アーカイブファイルをダウンロードし、展開して出来たディレクトリをnginxのドキュメントルートに`phpMyAdmin`という名前でコピーします。

*config.inc.php*

config.sample.inc.phpをconfig.inc.phpにリネームして下記の箇所を修正します。(抜粋)

```php
$cfg['blowfish_secret'] = '<適当な文字列を記述>'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = '<pmaユーザーのパスワードを記述>';
```

ここのコメントをはずします。

```php
/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
```

*sql/create_tables.sql*

sqlディレクトリ下にデータベースやテーブルを作成するsqlファイルが用意されています。
コメントになっているGRANT文を有効にします。

```sql
-- Privileges
--
-- (activate this statement if necessary)
GRANT SELECT, INSERT, DELETE, UPDATE, ALTER ON `phpmyadmin`.* TO 'pma'@localhost;
```

#### MySQL

MySQLを起動しrootユーザーでログインし、上記のsqlファイルでデータベースとテーブルを作成します。

```sql
> source D:\dev\nginx\html\phpMyAdmin\sql\create_tables.sql
```

pmaユーザーのパスワードを設定します。

```sql
> set password for pma@localhost = password('<pmaのパスワード>');
```

#### nginxの設定

*nginx.conf*

confファイルに下記を追記します。

```text
server {
    listen       80;
    server_name  phpmyadmin.localhost;

    access_log  logs/php.access.log  main;

    location / {
        root   html/phpMyAdmin;
        index  index.php;
    }

    location ~ \.php$ {
        root           html/phpMyAdmin;
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

}
```

*hosts*

hostsファイルに下記を追記します。

```text
127.0.0.1  phpmyadmin.localhost
```

#### php-cgi

nginxでphpスクリプトが実行できるようphp-cgiを起動します。

```bat
> php-cgi.exe -b 127.0.0.1:9001
```

##### 動作確認

`http://phpmyadmin.localhost/`にアクセスしてphpMyAdminのログインページが表示されることを確認します。


### バックエンドのwebアプリケーションと連携させる

同一ホスト上で実行しているspring-bootで作成したwebアプリケーションと連携させます。

#### nginxの設定

serverディレクティブの記述を下記のように修正します。

```text
server {
    listen       80;
    server_name  localhost;

    access_log  logs/web.access.log  main;

    location / {
        proxy_http_version 1.1;
        proxy_pass http://localhost:9000;
        proxy_redirect http://localhost:9000/ /;
        proxy_cookie_path / /;

        proxy_set_header        Host              $host;
        proxy_set_header        X-Forwarded-By    $server_addr:$server_port;
        proxy_set_header        X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto http;
        proxy_set_header        X-Real-IP         $remote_addr;
        proxy_set_header        X-Forwarded-Port  $server_port;

        root   html;
        index  index.html index.htm;
    }

    error_page  404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
```

##### 動作確認

`http://localhost/`にアクセスしてspring-bootで作成したwebアプリケーションのページが表示されることを確認します。



### nginxのssl設定の参考

* [HowTo: Create a Self-Signed SSL Certificate on Nginx For CentOS / RHEL] (http://www.cyberciti.biz/faq/nginx-self-signed-certificate-tutorial-on-centos-redhat-linux/)
* [nginx managed SSL with Tomcat 7] (http://stackoverflow.com/questions/19916906/nginx-managed-ssl-with-tomcat-7)