Symfoware

Symfowareについての考察blog

Ubuntu16.04 Server + nginx + php-fpmの動作環境を構築する

Ubuntu16.04 Serverにnginxをインストール。
php-fpmを使用してphpが動作する環境を作成してみます。

Debian版の過去記事を参考にしました。
Debian 7 + nginx + php-fpmな環境を構築する



php-fpmのインストール



aptでphp-fpmをインストールしました。


$ sudo apt install php7.0-fpm




php-fpmの設定ファイルは
「/etc/php/7.0/fpm/php-fpm.conf」

phpの設定ファイルは
「/etc/php/7.0/fpm/php.ini」

にそれぞれ作成されます。


動作モードを確認するため、php-fpmの設定ファイルを確認します。


$ vi /etc/php/7.0/fpm/php-fpm.conf



ファイルの末尾付近


;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;

; Multiple pools of child processes may be started with different listening
; ports and different management options. The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
; - the global prefix if it's been set (-p argument)
; - /usr otherwise
include=/etc/php/7.0/fpm/pool.d/*.conf



/etc/php/7.0/fpm/pool.d/にある設定ファイルを読み込んでいます。
このディレクトリにはwww.confがあるので、この中身を見てみます。


$ vi /etc/php/7.0/fpm/pool.d/www.conf




listenの項目を探します。


; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;     will be used.
user = www-data
group = www-data

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
; 'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /run/php/php7.0-fpm.sock




ユーザーは「www-data」で動作。
unix-socket「/run/php/php7.0-fpm.sock」をリッスンしていることがわかりました。

nginxからは、このソケットにリクエストを転送するよう指定します。



php-fpmの起動と自動起動設定



systemctlでOS起動時にサービスが開始されるか確認してみます。


$ systemctl list-unit-files --type=service | grep php
php7.0-fpm.service                         enabled



インストール時に自動起動が有効になっていますね。
/run/phpにpidファイルとsocketファイルが作成されていました。


$ ls /run/php | grep php
php7.0-fpm.pid
php7.0-fpm.sock







nginxのインストール



引き続き、aptでnginxのインストールを行います。


$ sudo apt install nginx



インストール後、サービスの状態を確認。


$ systemctl list-unit-files --type=service | grep nginx
nginx.service                             enabled




php-fpm同様、nginxも自動起動が有効になっています。
インストール後、ブラウザでhttp://[サーバーIP]/を表示してみると、こんなページが表示されるはずです。

849_01.png




nginxの設定



拡張子phpのリクエストがきたら、php-fpmにリクエストを転送するよう設定します。
編集する設定ファイルは「/etc/nginx/sites-enabled/default」


$ sudo vi /etc/nginx/sites-enabled/default



50行目付近にphp設定のサンプルがコメントアウトされた状態で記載されています。
socketを使用する箇所のコメントを解除し、有効にします。


        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #     # With php7.0-cgi alone:
        #     fastcgi_pass 127.0.0.1:9000;
        #     # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }




編集が終わったらnginxを再起動。


$ sudo service nginx restart




wwwのルートはデフォルトで「/var/www/html」となっています。
/var/www/html/info.phpを作成


$ sudo vi /var/www/html/info.php




phpinfoを表示してみます。


  1. <?php phpinfo(); ?>




ブラウザでhttp://[サーバーIP]/info.phpを表示。

849_02.png

ちゃんとphpが動いてくれていますね。
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2018/04/18(水) 23:07:37|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

waifu2x.pyを使用してjpg画像を拡大する

画像を拡大した時のノイズを低減するwaifu2x
二次元画像を拡大したいと思ったことはありませんか?
https://github.com/nagadomi/waifu2x

実行にはNVIDIA GPUが必要で、ちょっと手が出ませんでした。


waifu2xとその派生ソフト一覧
こちらを見てみると、単体のpythonファイルで実行できる実装「waifu2x.py」があるようです。

動かしてみようと思います。


waifu2x.py



プログラムを取得します。


$ wget https://marcan.st/transf/waifu2x.py




依存しているライブラリは以下のとおり。

numpy
scipy
PIL

pip3でも良いのですが、今回はaptでインストールしました。


$ sudo apt install python3-numpy python3-scipy python3-pil





model



実行には学習結果を記録したモデルファイルが必要です。
本家waifu2xの「models/vgg_7/art_y」にあるjsonファイルを利用しました。
https://github.com/nagadomi/waifu2x/tree/master/models/vgg_7/art_y

サイズを2倍に拡大するモデルファイルを取得


$ wget -O scale2.0x_model.json https://github.com/nagadomi/waifu2x/blob/master/models/vgg_7/art_y/scale2.0x_model.json?raw=true




プログラムは


$ python3 waifu2x.py [入力画像ファイル] [出力画像ファイル] [モデルファイル]



で実行します。

今回はこのimage.jpgを拡大してみました。

848_01.jpg

実行中、進捗が表示されます。それなりに時間がかかります。


$ python3 waifu2x.py image.jpg result.jpg scale2.0x_model.json

0.1%...32
32
3.3%...32
32
9.7%...64
64
22.6%...64
64
48.2%...128
128
99.6%...128
128
100.0%...Done




比較対象として、PILで画像を拡大したものも用意しました。


  1. # -*- coding:utf8 -*-
  2. from PIL import Image
  3. im = Image.open('image.jpg')
  4. im_resized = im.resize((im.width * 2, im.height * 2))
  5. im_resized.save('resized.jpg')




PILでの拡大結果。

848_02.jpg


waifu2x.pyでの拡大結果。

848_03.jpg


PILでの拡大よりは輪郭が自然で明らかに良いのですが、若干ノイズが混ざるようです。
waifu2x.pyはアルゴリズムの理解のために作成されたようで、
これ以上クリアな画像を得るのは難しそうでした。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/04/17(火) 23:22:34|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

NGINX unit 設定値の編集方法(Configuration)

Ubuntu Server 16.04にNGINX unitをインストールしました。
NGINX UnitをUbuntu Server 16.04にインストール

今回は設定方法を調べてみます。

Configuration



こちらを参考にしました。
http://unit.nginx.org/configuration/

curlでunix-socketにアクセスして設定値を送り込む方法のようです。

control.unit.sockは/var/runに作成されているので、
/path/to/control.unit.sockと記載されている箇所は
/var/run/control.unit.sockに読み替えて進めていきます。
unix-socketが作成されているパスを確認する(netstat)




Display the Full Configuration



インストールした後、phpinfoが表示されるところまで試しました。
NGINX UnitをUbuntu Server 16.04にインストール

この状態で、設定値がどうなっているか表示してみます。


$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/



表示された内容は以下のとおり。


  1. {
  2.     "applications": {
  3.         "example_php": {
  4.             "type": "php",
  5.             "user": "nobody",
  6.             "processes": 2,
  7.             "root": "/usr/share/doc/unit-php/examples/phpinfo-app",
  8.             "index": "index.php"
  9.         }
  10.     },
  11.     "listeners": {
  12.         "*:8300": {
  13.             "application": "example_php"
  14.         }
  15.     }
  16. }



/usr/share/doc/unit-php/examples/phpinfo-app/index.phpを見てみると、
確かにphpinfoが表示される内容となっていました。


・/usr/share/doc/unit-php/examples/phpinfo-app/index.php


  1. <?php phpinfo(); ?>





Display One Object



アプリケーション「example_php」の内容のみ表示してみます。


$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/applications/example_php




実行結果


  1. {
  2.     "type": "php",
  3.     "user": "nobody",
  4.     "processes": 2,
  5.     "root": "/usr/share/doc/unit-php/examples/phpinfo-app",
  6.     "index": "index.php"
  7. }




同様に、リスナーの内容のみ表示してみます。


$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/listeners




実行結果


  1. {
  2.     "*:8300": {
  3.         "application": "example_php"
  4.     }
  5. }






Deleting Configuration Objects



設定値を削除してみます。

まずはリスナー


$ sudo curl -X DELETE --unix-socket /var/run/control.unit.sock http://localhost/listeners/*:8300




  1. {
  2.     "success": "Reconfiguration done."
  3. }




続いてアプリケーション


$ sudo curl -X DELETE --unix-socket /var/run/control.unit.sock http://localhost/applications/example_php




  1. {
  2.     "success": "Reconfiguration done."
  3. }



これで設定値は空になりました。


$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/




  1. {
  2.     "applications": {},
  3.     "listeners": {}
  4. }




ちなみに、リスナーが存在している状態でアプリケーションを削除しようとすると
こんなエラーが発生します。


$ sudo curl -X DELETE --unix-socket /var/run/control.unit.sock http://localhost/applications/example_php




  1. {
  2.     "error": "Invalid configuration.",
  3.     "detail": "Listening socket is assigned for a non existing application \"example_php\"."
  4. }







設定値の追加



/var/wwwにindex.phpを作成。
これを8300ポートで公開する設定を追加してみます。

まずディレクトリとファイルを作成。


$ sudo mkdir -p /var/www
$ sudo vi /var/www/index.php



こんな内容を記載しました。


  1. <html>
  2. <body>
  3. hello, world!
  4. </body>
  5. </html>




続いて、設定値を記載したjsonファイルを作成します。

・sample.json


  1. {
  2.     "listeners": {
  3.         "*:8300": {
  4.             "application": "sample"
  5.         }
  6.     },
  7.     "applications": {
  8.         "sample": {
  9.             "type": "php",
  10.             "user": "nobody",
  11.             "processes": 2,
  12.             "root": "/var/www/",
  13.             "index": "index.php"
  14.         }
  15.     }
  16. }




作成したファイルを指定して、設定を実行。


$ sudo curl -X PUT -d @sample.json --unix-socket /var/run/control.unit.sock http://localhost/




  1. {
  2.     "success": "Reconfiguration done."
  3. }




設定は即時反映されるようです。
ブラウザでhttp://[サーバーIP]:8300/を表示すると、狙い通りの結果になりました。

847_01.png




Modifying Configuration Objects



設定値の変更を試してみます。
アプリケーションの公開ディレクトリを/var/wwwから/var/www2に変更してみます。

まずは公開用のディレクトリをファイルを用意。


$ sudo mkdir -p /var/www2
$ sudo vi /var/www2/index.php



index.phpの内容はこのようにしました。


  1. <html>
  2. <body>
  3. <?php echo('hello, world! from PHP'); ?>
  4. </body>
  5. </html>




/var/www2への変更を実行します。


$ sudo curl -X PUT -d '"/var/www2"' --unix-socket /var/run/control.unit.sock http://localhost/applications/sample/root




  1. {
  2.     "success": "Reconfiguration done."
  3. }



ブラウザをリロードしてみると、表示が変更されました。

847_02.png


念の為、現在の設定値を確認してみます。


$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/




  1. {
  2.     "listeners": {
  3.         "*:8300": {
  4.             "application": "sample"
  5.         }
  6.     },
  7.     "applications": {
  8.         "sample": {
  9.             "type": "php",
  10.             "user": "nobody",
  11.             "processes": 2,
  12.             "root": "/var/www2",
  13.             "index": "index.php"
  14.         }
  15.     }
  16. }


関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2018/04/16(月) 22:58:10|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

curl --unix-socketで「curl: (7) Couldn't connect to server」

こちらの記事を試してみようとしたところ、
http://unit.nginx.org/configuration/


$ curl --unix-socket /var/run/control.unit.sock http://localhost/
curl: (7) Couldn't connect to server



接続できないというエラーになります。



root権限



ドキュメントをよく見ると、


# curl --unix-socket /var/run/control.unit.sock http://localhost/



となっています。
オチは簡単でsudoが必要でした。


$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/
{
    "applications": {
        "example_php": {
            "type": "php",
            "user": "nobody",
            "processes": 2,
            "root": "/usr/share/doc/unit-php/examples/phpinfo-app",
            "index": "index.php"
        }
    },

    "listeners": {
        "*:8300": {
            "application": "example_php"
        }
    }
}


関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2018/04/16(月) 22:20:34|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

unix-socketが作成されているパスを確認する(netstat)

こちらの記事を試してみようとしたところ、
http://unit.nginx.org/configuration/

「control.unit.sock」というファイルが作成されることはわかったのですが、
パスがわからない。


netstat



こちらが参考になりました。
調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話


$ netstat -al --protocol=unix



で確認できます。

実際に使用したのは、grepで「unit」という文字を含むものだけ抽出。


$ netstat -al --protocol=unix | grep unit

unix 2     [ ACC ]     STREAM     LISTENING     33119    /var/run/control.unit.sock




これで、「/var/run」に作成されていることがわかりました。


【参考URL】

調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話

関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2018/04/16(月) 22:17:32|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ