nginxをリバースプロキシ化して、nginx unitを呼び出す

やっとわかってきたぞ。

$ cd /etc/nginx/
$ sudo vi nginx.conf

で、設定ファイルの内容を変更する。
念のためにnginx.confのバックアップを取っておくことを超お勧めする。

全文は次の通り。
色の変わっているところが変更部分だ。
とりあえずの設定だから、80ポートにアクセスするとwsgiファイルが反応する。
他のhtmlファイル等は反応できないので、それは別途調整が必要。

=== 以下、nginx.confファイルの内容===
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream unit_backend {
        server 127.0.0.1:8400;
        }



    server {
        listen       80;

        server_name  localhost;

        location / {
           proxy_pass http://unit_backend;
           proxy_set_header Host $host;


        }

    }

}

wsgiファイルをいじってみる

Pythonのコードを書いてゆくうえで、まずはwsgiを変更してゆけばよい

wsgi.pyを変更したら、
$ sudo systemctl restart unit

でnginx unitの再起動が必要。

テストから離れたディレクトリの変更などは、別途挑戦予定。

→ディレクトリ変更はできた。
 /var/www/python-app に移動して、表示できることを確認済み。

nginx unitの設定値を見てみる

まず現状のnginx unitの設定値がどうなっているのか調べてみる。

$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/
{
        "applications": {
                "example_python": {
                        "type": "python 3.6",
                        "user": "nobody",
                        "processes": 2,
                        "path": "/usr/share/doc/unit-python3.6/examples/python-app",
                        "module": "wsgi"
                }
        },

        "listeners": {
                "*:8400": {
                        "application": "example_python"
                }
        }
}

なんか良く分からないが、8400ポートはexsample_pythonというアプリケーションのリスナーに使われている。
アプリケーションの設定は"applications"の中で定義されていて、ポート8400にアクセスがあると、/usr/share/doc/unit-python3.6/examples/python-app というディレクトリにあるwsgiというモジュールを読み込んでいるらしい。wsgiファイルはwsgi.py が正式なファイル名だった。

では、ここから実験。
アプリケーションリスナー設定を削除してみる。

$ sudo curl -X DELETE --unix-socket /var/run/control.unit.sock http://localhost/listeners/*:8400
{
        "success": "Reconfiguration done."
}

アプリケーション設定も削除してみる。
$ sudo curl -X DELETE --unix-socket /var/run/control.unit.sock http://localhost/applications/example_python
{
        "success": "Reconfiguration done."
}

本当に削除されたのか確認。

$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/
{
        "applications": {},
        "listeners": {}
}

削除されて空っぽになっている。
この状態でポート番号8400にアクセスするとどうなるのか?

$ curl http://localhost:8400
curl: (7) Failed to connect to localhost port 8400: 接続を拒否されました

予定通り繋がらなくなっている。

じゃあ最初の設定を start.json というファイルに保存して、再設定を掛けたらどうなるのか?

$ sudo curl -X PUT -d @start.json --unix-socket /var/run/control.unit.sock http://localhost/
{
        "success": "Reconfiguration done."
}

成功したらしい。
ちゃんと動いているのか確認してみる。

$ curl http://localhost:8400
2018-07-13 01:49:38 PM

Python: 3.6.5 (default, Apr  1 2018, 05:46:30)
[GCC 7.3.0]

ENV Variables:

LANG    ja_JP.UTF-8
LANGUAGE        ja_JP:ja
PATH    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
INVOCATION_ID   4495414f19f340b695fbcf64bf14c449
JOURNAL_STREAM  9:19378
DAEMON_ARGS     --log /var/log/unit.log --pid /run/unit.pid


動いているね。
ふむふむ、少しずつ分かってきたような。。。気もしてきた。

/etc/nginx/mime.types の中身

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}

/etc/nginx/nginx.conf の中身

#user  nobody;
#Defines which Linux system user will own and run the Nginx server

worker_processes  1;
#Referes to single threaded process. Generally set to be equal to the number of CPUs or cores.

#error_log  logs/error.log; #error_log  logs/error.log  notice;
#Specifies the file where server logs.

#pid        logs/nginx.pid;
#nginx will write its master process ID(PID).

events {
    worker_connections  1024;
    # worker_processes and worker_connections allows you to calculate maxclients value:
    # max_clients = worker_processes * worker_connections
}


http {
    include       mime.types;
    # anything written in /opt/nginx/conf/mime.types is interpreted as if written inside the http { } block

    default_type  application/octet-stream;
    #

    #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;

    sendfile        on;
    # If serving locally stored static files, sendfile is essential to speed up the server,
    # But if using as reverse proxy one can deactivate it

    #tcp_nopush     on;
    # works opposite to tcp_nodelay. Instead of optimizing delays, it optimizes the amount of data sent at once.

    #keepalive_timeout  0;
    keepalive_timeout  65;
    # timeout during which a keep-alive client connection will stay open.

    #gzip  on;
    # tells the server to use on-the-fly gzip compression.

    server {
        # You would want to make a separate file with its own server block for each virtual domain
        # on your server and then include them.
        listen       80;
        #tells Nginx the hostname and the TCP port where it should listen for HTTP connections.
        # listen 80; is equivalent to listen *:80;

        server_name  localhost;
        # lets you doname-based virtual hosting

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #The location setting lets you configure how nginx responds to requests for resources within the server.
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

/etc/nginx/conf.default.conf の中身

#user  nobody;
#Defines which Linux system user will own and run the Nginx server

worker_processes  1;
#Referes to single threaded process. Generally set to be equal to the number of CPUs or cores.

#error_log  logs/error.log; #error_log  logs/error.log  notice;
#Specifies the file where server logs. 

#pid        logs/nginx.pid;
#nginx will write its master process ID(PID).

events {
    worker_connections  1024;
    # worker_processes and worker_connections allows you to calculate maxclients value: 
    # max_clients = worker_processes * worker_connections
}


http {
    include       mime.types;
    # anything written in /opt/nginx/conf/mime.types is interpreted as if written inside the http { } block

    default_type  application/octet-stream;
    #

    #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;

    sendfile        on;
    # If serving locally stored static files, sendfile is essential to speed up the server,
    # But if using as reverse proxy one can deactivate it
    
    #tcp_nopush     on;
    # works opposite to tcp_nodelay. Instead of optimizing delays, it optimizes the amount of data sent at once.

    #keepalive_timeout  0;
    keepalive_timeout  65;
    # timeout during which a keep-alive client connection will stay open.

    #gzip  on;
    # tells the server to use on-the-fly gzip compression.

    server {
        # You would want to make a separate file with its own server block for each virtual domain
        # on your server and then include them.
        listen       80;
        #tells Nginx the hostname and the TCP port where it should listen for HTTP connections.
        # listen 80; is equivalent to listen *:80;
        
        server_name  localhost;
        # lets you doname-based virtual hosting

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #The location setting lets you configure how nginx responds to requests for resources within the server.
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

nginxの再インストールでハマった件

なんかnginx unitと組み合わせてごちゃごちゃやっていたら壊れてしまった。
再インストールしても起動しなかった。

理由は次の3つのファイルがないため。
/etc/nginx/conf/default.conf
/etc/nginx/nginx.conf
/etc/nginx/mime.types

これが再インストール時に自動的に復活しない仕様はどうなんだよ、と思う。

Nginx Unitを自動起動させるには

毎回手動で立ち上げるのはめんどくさいからさ。

Nginx Unitをサーバ起動時に自動的に稼働させるためには
$ sudo systemctl enable unit
Synchronizing state of unit.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable unit

ではリブートした後どうなるか?

$ curl http://localhost:8400/
2018-07-03 08:44:39 PM

Python: 3.6.5 (default, Apr  1 2018, 05:46:30)
[GCC 7.3.0]

ENV Variables:

LANG    ja_JP.UTF-8
LANGUAGE        ja_JP:ja
PATH    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
INVOCATION_ID   8bc876ae223a4d618ebed74ed7ed9650
JOURNAL_STREAM  9:20761
DAEMON_ARGS     --log /var/log/unit.log --pid /run/unit.pid

うん、立ち上がっているね!!

Nginx Unitのインストール

Ubuntuだと比較的楽にインストールできるそうだ。

最初にキーファイルをダウンロードする。

$ wget https://nginx.org/keys/nginx_signing.key
--2018-07-02 20:15:26--  https://nginx.org/keys/nginx_signing.key
nginx.org (nginx.org) をDNSに問いあわせています... 2606:7100:1:69::3f, 2001:1af8:4060:a004:21::e3, 206.251.255.63, ...
nginx.org (nginx.org)|2606:7100:1:69::3f|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1561 (1.5K) [text/plain]
`nginx_signing.key' に保存中

nginx_signing.key             100%[=================================================>]   1.52K  --.-KB/s    時間 0s

2018-07-02 20:15:26 (105 MB/s) - `nginx_signing.key' へ保存完了 [1561/1561]

apt-keyでキーファイルを追加する。

$ sudo apt-key add nginx_signing.key

/etc/apt/sources.list.d/unit.listを作成する。

$ sudo vi /etc/apt/sources.list.d/unit.list

今回はUbuntu18.04を使っているので、次の内容を記載して保存する。

deb https://packages.nginx.org/unit/ubuntu/ bionic unit
deb-src https://packages.nginx.org/unit/ubuntu/ bionic unit

それじゃインストールを始めますか。

$ sudo apt update
$ sudo apt install unit

インストールが終わるとこんなメッセージが出る。

----------------------------------------------------------------------

Thank you for installing NGINX Unit!

Additional modules are available in standalone packages.
To see the available modules, run: apt search --names-only '^unit-'

Online documentation is available at https://unit.nginx.org/

----------------------------------------------------------------------

追加モジュールをインストールしろということなのな。
で、何を利用できるのか、追加モジュール一覧を表示させてみる。

$ apt search --names-only '^unit-'
ソート中... 完了
全文検索... 完了
unit-dbg/stable 1.2-1~bionic amd64
  NGINX Unit (debug symbols)

unit-go1.10/stable 1.2-1~bionic all
  Go 1.10 module for NGINX Unit

unit-go1.9/stable 1.2-1~bionic all
  Go 1.9 module for NGINX Unit

unit-perl/stable 1.2-1~bionic amd64
  Perl module for NGINX Unit

unit-perl-dbg/stable 1.2-1~bionic amd64
  Perl module for NGINX Unit (debug symbols)

unit-php/stable 1.2-1~bionic amd64
  PHP module for NGINX Unit

unit-php-dbg/stable 1.2-1~bionic amd64
  PHP module for NGINX Unit (debug symbols)

unit-python2.7/stable 1.2-1~bionic amd64
  Python 2.7 module for NGINX Unit

unit-python2.7-dbg/stable 1.2-1~bionic amd64
  Python 2.7 module for NGINX Unit (debug symbols)

unit-python3.6/stable 1.2-1~bionic amd64
  Python 3.6 module for NGINX Unit

unit-python3.6-dbg/stable 1.2-1~bionic amd64
  Python 3.6 module for NGINX Unit (debug symbols)

unit-ruby/stable 1.2-1~bionic amd64
  Ruby module for NGINX Unit

unit-ruby-dbg/stable 1.2-1~bionic amd64
  Ruby module for NGINX Unit (debug symbols)

今回はPythonだから、次のコマンドで追加モジュールをインストールする。

$ sudo apt install unit-python3.6

インストールが終わるとこんなメッセージが表示される。

----------------------------------------------------------------------

The Python 3.6 module for NGINX Unit has been installed.

To check out the sample app, run these commands:

 sudo service unit restart
 sudo service unit loadconfig /usr/share/doc/unit-python3.6/examples/unit.config
 curl http://localhost:8400/

Online documentation is available at https://unit.nginx.org

----------------------------------------------------------------------

いったんサーバをリブートしてみる。

$ sudo service unit restart
$ sudo service unit loadconfig /usr/share/doc/unit-python3.6/examples/unit.config
Loading configuration from /usr/share/doc/unit-python3.6/examples/unit.config...
{
        "success": "Reconfiguration done."
}
$ curl http://localhost:8400/
2018-07-02 08:39:02 PM

Python: 3.6.5 (default, Apr  1 2018, 05:46:30)
[GCC 7.3.0]

ENV Variables:

LANG    ja_JP.UTF-8
LANGUAGE        ja_JP:ja
PATH    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
INVOCATION_ID   11aa09ac823a44d2ab01da6ad6208da1
JOURNAL_STREAM  9:26162
DAEMON_ARGS     --log /var/log/unit.log --pid /run/unit.pid

なんかよくわからないが、なんか動いているんだよね。

Nginx稼働に関する管理方法

大事なことだから転記しておく。

Nginxを停止する場合
$ sudo systemctl stop nginx

停止していたNginxを稼働させる場合
$ sudo systemctl start nginx

Nginxを再起動(一旦停止後再起動)させる場合
$ sudo systemctl restart nginx

Nginxの設定を変更した場合は、再起動させずに設定の反映が可能
$ sudo systemctl reload nginx

Nginxをサーバ起動時に自動的に稼働させたくない場合
$ sudo systemctl disable nginx

Nginxをサーバ起動時に自動的に稼働させたい場合
$ sudo systemctl enable nginx

Ubuntu18にNginxをインストールする

参考にしたのはこちら。
https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04

$ sudo apt update
$ sudo apt install nginx

シレっとインストール完了。

FireWallのステータスを確認する。

$ sudo ufw app list
利用可能なアプリケーション:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
  Samba

で、Nginxのためにポートを開放する。

$ sudo ufw allow 'Nginx HTTP'
ルールを追加しました
ルールを追加しました (v6)

じゃ状況はどうなったか?

$ sudo ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
Nginx HTTP                 ALLOW       Anywhere
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

OK、OK。
もちろん上記には、差しさわりのあるポート開放情報は表示はさせていないよ。

Webサーバのステータスはどんな感じ?

$ 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 Mon 2018-07-02 05:24:27 JST; 7min ago
     Docs: man:nginx(8)
  Process: 2360 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 2348 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 2361 (nginx)
    Tasks: 5 (limit: 4370)
   CGroup: /system.slice/nginx.service
           ├─2361 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─2364 nginx: worker process
           ├─2366 nginx: worker process
           ├─2368 nginx: worker process
           └─2370 nginx: worker process

 7月 02 05:24:27 niwatori systemd[1]: Starting A high performance web server and a reverse proxy server...
 7月 02 05:24:27 niwatori systemd[1]: Started A high performance web server and a reverse proxy server.

動いてはいるが、プロセスを5つも立ち上げる必要はないな。
これはあとで調整しよう。

で、念のためにサーバをリブートして、ブラウザからhttp://IPアドレスと打ってどうなるか?

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

と表示されたら成功だ。