Armadilloフォーラム

Armadillo-X1におけるlighttpdとphpを用いたHTTP通信について

sho_oikawa

2021年1月7日 10時58分

お世話になります。
及川と申します。

https://armadillo.atmark-techno.com/blog/1913/2872
の記事を参考に外部機器からのHTTP情報をphpを利用して取得を試みているのですが、うまくいきません。
(raspberry piにてapacheを用いた組み合わせでは確認済み。)

上記のリンク記事自体から約3年経過し、Armadillo上での設定もconf-availableから必要な箇所を
有効化するなどの手順となっているため、流れに若干の違いはありますが
それでもうまくいかないです。

試した手順としては次のようになります。
1.[apt update]で情報を更新。
2.[apt install php-cgi]にてインストール
 phpのバージョンは7.0(PHP 7.0.33+deb9u10)です。
3.[/etc/lighttpd/conf-available/15-fastcgi-php.conf]を参考リンクのように変更。
4.[lighty-enable-mod]にてfastcgi, fastcgi-phpを有効化。lighttpdのサービスリスタート。
5.添付ファイル[index.php](添付にはindex.php_.txt)に対してHTTP送信。

上記の手順を踏みましたが、うまくいきませんでした。
phpのコマンドで[index.php]を実行した場合、とりあえずファイル作成はできましたので、
phpのインストールが失敗している、などではないようです。
どのようにすれば通信ができるかご教授いただければ幸いです。

以上、よろしくお願いいたします。

ファイル ファイルの説明
index.php_.txt
コメント
# tail -f /var/log/lighttpd/error.log

を実行した状態でアクセスすると、次のようなログ出ていませんか?

FastCGI-stderr: PHP Warning:  file_put_contents(/var/www/json/getdata.json): failed to open stream: Permission denied in /var/www/html/index.php on line 9

恐らく、mkdir /var/www/jsonでディレクトリ作ったと思うのですが、
ルート権限で作った場合、このディレクトリにroot以外の書き込み権限は
付いていないので所有者をwww-data(これはlighttpdのプロセスの権限です)
にしてみてください。

# chown www-data /var/www/json

これでgetdata.jsonが作られ、書き込みもされるはずです。
自分はPCからcurlでためしてみました。

curl -X POST -d '{"json":"message"}' http://[ArmadilloのIP]/index.php

at_ohsawa様

返答いただきありがとうございます。

>

> # tail -f /var/log/lighttpd/error.log
> 

>
> を実行した状態でアクセスすると、次のようなログ出ていませんか?

上記のコマンドを実行した状態でアクセスしましたが、ログに新しく追記されることもありませんでした。。。
また、参考にさせていただいた実行権やユーザーについても[chmod -R][chown -R]のようなコマンドで
一通り確認、再定義してみましたが、こちらが原因というわけではないようです。

また先方のphpから送信されるデータを確認したところ、
Content-type: application/json
であったため、lighttpd.confの[compress.filetype]に”application/json”を追加してみましたが、
うまくいかないという状況です。

以上、よろしくお願いいたします。

> 上記のコマンドを実行した状態でアクセスしましたが、ログに新しく追記されることもありませんでした。。。

ということは、おそらくfastcgiが動いていないです。lighttpdの設定に
問題があるのだと思いますが、今のlighttpdは、先の3.4.のステップは
設定ファイルを触る必要も無く簡単にできるので、次の方法で一旦設定
ファイル消して、最初から試す方法書いておきます。

# apt-get purge  lighttpd
# rm -rf   /var/www
# apt install   lighttpd
# lighttpd-enable-mod   fastcgi-php
# service   lighttpd force-reload
# cp index.php   /var/www/html
# mkdir   /var/www/json
# chown   www-data   /var/www/json

ここまで再起動は不要です。

> また先方のphpから送信されるデータを確認したところ、
> Content-type: application/json
> であったため、lighttpd.confの[compress.filetype]に”application/json”を追加してみましたが、

これは必要ないです。

別のサーバーとの疎通に問題があるのかcgiが動作しないのかの切り分けができないので、
試す時は、まずPCからarmadilloへのpingで疎通確認して、
そのPCから先述のcurlでアクセスし、ログとgetdata.jsonを確認してみてください。

情報の追記となります。
wiresharkなどを用いて調べた内容となります。

先方の通信によって、特定のディレクトリに対して
POSTの送信を行っておりますが、その際のプロトコルは[TCP]となっておりました。
また、その際に通信先を指定しておりますが、
/(ディレクトリ名)/index.php
のような記載ではなく、
/(ディレクトリ名)
となり、index.php自体の記載はありませんでした。
外部機器自体の仕様であり、ここを変更できません。。。
どのみちapacheで実証した際にはデータ取得できておりましたので、
悩ましいところです。

現状のserver.document-rootとしては[/var/www]となっています。
先方から指定されるディレクトリ名は[/dir1/dir2]のようになっており、
armadilloの内部的には[/var/www/dir1/dir2]の構成で用意してあります。
(/dir1/dir2は仮ディレクトリ名です。)

lighttpd.conf自体の設定に不足などがあるのでしょうか。。。

以上、よろしくお願いいたします。

> /(ディレクトリ名)/index.php
> のような記載ではなく、
> /(ディレクトリ名)
> となり、index.php自体の記載はありませんでした。

それですね。
/(ディレクトリ名)/ でアクセスするのであればindex.phpを自動で
読みますが、"/"が最後に無い場合は、そういう名前のファイルを
探します。設定の変更が必要です。

次のようにしてみてください

# lighttpd-enable-mod  rewrite
# echo "url.rewrite-once = ( "^/dir1/dir2" => "/dir1/dir2/")" >> /etc/lighttpd/lighttpd.conf 
(dir1/dir2は実態にあわせてください)
# service lighttpd force-reload

これで期待する動作になるはずです。

個人的には、apacheの初期設定は便利ですが意図しないアクセスの
可能性があるので、厳しいlighttpdが好きなのですが
Armadilloでlighttpdを必ずしも使う必要はないので、
apacheの方がメンテナンスしやすければapt remove lighttp
してapt install apache2して入れ替えちゃっていいと思います。

> 外部機器自体の仕様であり、ここを変更できません。。。
> どのみちapacheで実証した際にはデータ取得できておりましたので、
> 悩ましいところです。
>
> 現状のserver.document-rootとしては[/var/www]となっています。
> 先方から指定されるディレクトリ名は[/dir1/dir2]のようになっており、
> armadilloの内部的には[/var/www/dir1/dir2]の構成で用意してあります。
> (/dir1/dir2は仮ディレクトリ名です。)
>
> lighttpd.conf自体の設定に不足などがあるのでしょうか。。。
>
> 以上、よろしくお願いいたします。

お教えいただいた項目を適用し、更に次の点について修正を行ったところ
うまく受信できるようになりました。

先方からの送信データはサイズが大きかったためか、
Expect: 100-continue
のようなパラメータが付いており、デフォルトの状態では取得できず
417: Expectation Failed
を返しており正常受信できておりませんでした。

そのため、lighttpd.confに対し
[server.reject-expect-100-with-417 = "disable"]
を追記したところ、受信できるようになりました。
ありがとうございます。

また、直接本件に関わることではないのですが、
ユーザーランド部に今回の[php-cgi]をインストールした状態としたい場合は
どのようにすればよいでしょうか。以前[ax1_resources/resources/packages]内に記載した際には
うまく入らなかったため、改めてお教えいただきたいです。
更に内部ファイルを[apt update]した状態でイメージファイルを作成したいと思っているのですが、
そちらについてもお教えいただけると幸いです。

以上、お手数ではございますがよろしくお願いいたします。

> どのようにすればよいでしょうか。以前[ax1_resources/resources/packages]内に記載した際には
> うまく入らなかったため、改めてお教えいただきたいです。

packagesの最後に一行 php-cgi と書くだけで入る事は確認しているので、
うまく入らなかったというのは、どういう状況なのか詳しく教えてもらえますか?

試しにビルドすると installed_pkgs_日付.list のファイルが出来て
grepで検索すると下記のようにインストールされた状態が確認できるはずです。

$ grep php  installed_pkgs_xxxxxxxxx.list
ii  php-cgi                       2:7.3+69                            all          server-side, HTML-embedded scripting language (CGI binary) (default)
ii  php-common                    2:69                                all          Common files for PHP packages
ii  php7.3-cgi                    7.3.19-1~deb10u1                    armhf        server-side, HTML-embedded scripting language (CGI binary)
ii  php7.3-cli                    7.3.19-1~deb10u1                    armhf        command-line interpreter for the PHP scripting language
ii  php7.3-common                 7.3.19-1~deb10u1                    armhf        documentation, examples and common module for PHP
ii  php7.3-json                   7.3.19-1~deb10u1                    armhf        JSON module for PHP
ii  php7.3-opcache                7.3.19-1~deb10u1                    armhf        Zend OpCache module for PHP
ii  php7.3-readline               7.3.19-1~deb10u1                    armhf        readline module for PHP

この状態にはなるけど、phpが実行できない等ということでしょうか?
それとも、このリストにも出ないですか?

> 更に内部ファイルを[apt update]した状態でイメージファイルを作成したいと思っているのですが、
> そちらについてもお教えいただけると幸いです。

build.shは毎回updateしてからイメージファイルを生成しているので、とくに何もしなくて良いです。

> packagesの最後に一行 php-cgi と書くだけで入る事は確認しているので、
> うまく入らなかったというのは、どういう状況なのか詳しく教えてもらえますか?
>
> 試しにビルドすると installed_pkgs_日付.list のファイルが出来て
> grepで検索すると下記のようにインストールされた状態が確認できるはずです。
>
>

> $ grep php  installed_pkgs_xxxxxxxxx.list
> ii  php-cgi                       2:7.3+69                            all          server-side, HTML-embedded scripting language (CGI binary) (default)
> ii  php-common                    2:69                                all          Common files for PHP packages
> ii  php7.3-cgi                    7.3.19-1~deb10u1                    armhf        server-side, HTML-embedded scripting language (CGI binary)
> ii  php7.3-cli                    7.3.19-1~deb10u1                    armhf        command-line interpreter for the PHP scripting language
> ii  php7.3-common                 7.3.19-1~deb10u1                    armhf        documentation, examples and common module for PHP
> ii  php7.3-json                   7.3.19-1~deb10u1                    armhf        JSON module for PHP
> ii  php7.3-opcache                7.3.19-1~deb10u1                    armhf        Zend OpCache module for PHP
> ii  php7.3-readline               7.3.19-1~deb10u1                    armhf        readline module for PHP
> 

>
> この状態にはなるけど、phpが実行できない等ということでしょうか?
> それとも、このリストにも出ないですか?

今回追加したのは最下行へコメントにて[# Append]とその次の行に[php-cgi]と追記したのみです。
リストを見たところ、何も記載されていない0byteのファイルができていました。

> build.shは毎回updateしてからイメージファイルを生成しているので、とくに何もしなくて良いです。
現状ではupdateが実行されていないようで、X1へとイメージ更新後にX1本体側でupdateを行わないと
いけない状態となっています。

因みに
ブートローダ:[uboot_2016.07-at20]
カーネル:[uImage-x1-v4.9-at16]
ユーザーランド:[debian-stretch-armhf_ax1_20200428.tar.gz]
ビルダー:[x1-debian-builder-v2.2.0]
等を使用しています。

> > build.shは毎回updateしてからイメージファイルを生成しているので、とくに何もしなくて良いです。
> 現状ではupdateが実行されていないようで、X1へとイメージ更新後にX1本体側でupdateを行わないと
> いけない状態となっています。

packagesに記載しているパッケージをインストールするためにapt-get updateが
必須になっている(fixupを改造していないかぎり、fixupにそのように書いています)ので、
php-cgiがインストールされていない件とあわせて、そもそもビルドに失敗している気がします。

build.shの実行はATDE7上のファイルシステムでしょうか?(USBメモリや共有ディスク等ではない)
また、実行時にコンソールに出るログもみせてもらえると原因が分かるかもしれません。

ログは次のようにすると取れます。

sudo  ./build.sh ax1 |tee log

返答いただきありがとうございます。
イメージファイル作成時のログを取ってみました。

また、内部ファイルにおいて[/var/lib/dpkg/status]の末尾に何かパラメータが追加され、
その内容でエラーが出ているような箇所もありました。

以前別件でご相談させていただいた折、X1上の同ファイルの末尾部分を削除したところ、
うまくインストールできた経緯はございます(一時的にですが。。。)

お手数ではございますが、こちらからご教授いただけますと幸いです。
よろしくお願いいたします。

ファイル ファイルの説明
log.txt

インターネットに繋がっていないか、DNSの設定に問題があるせいで
パッケージサーバーに接続できていないようです。

Err:1 http://security.debian.org stretch/updates InRelease
  Temporary failure resolving 'security.debian.org'
Err:2 http://ftp.jp.debian.org/debian stretch InRelease
  Temporary failure resolving 'ftp.jp.debian.org'
Err:3 http://download.atmark-techno.com/debian stretch InRelease
  Temporary failure resolving 'download.atmark-techno.com'

x1-debian-builderを動かしているATDE内でWebブラウザを開いて
webサイトを見ることはできますか?
あるいは、インターネット接続するためにプロキシが必要な環境では
無いでしょうか?

> x1-debian-builderを動かしているATDE内でWebブラウザを開いて
> webサイトを見ることはできますか?
> あるいは、インターネット接続するためにプロキシが必要な環境では
> 無いでしょうか?

プロキシが必要な環境下ではありますが、一通り通しているつもりです。
インターネットの画面閲覧の他、エラーとなった個所にpingを投げてみましたが、
そちらではうまくいっているようです。

wgetとaptにはプロキシ用に設定ファイルを作成しておりますが、
他にプロキシを通す必要のあるコマンドなどはあるでしょうか。

ファイル ファイルの説明
ATDE7_キャプチャ.PNG
ping.txt

> プロキシが必要な環境下ではありますが、一通り通しているつもりです。
> インターネットの画面閲覧の他、エラーとなった個所にpingを投げてみましたが、
> そちらではうまくいっているようです。
>
> wgetとaptにはプロキシ用に設定ファイルを作成しておりますが、
> 他にプロキシを通す必要のあるコマンドなどはあるでしょうか。

追記です。
https://armadillo.atmark-techno.com/forum/armadillo/2289
にあったようにビルド時にプロキシを与える方法をとってみましたが、
こちらでも失敗しました。

他には事前に設定を行っていた[/etc/apt/apt.conf]、[/etc/wgetrc]の他に
[/etc/apt/apt.conf.d/80proxy]についてもプロキシの内容を記載してみましたが、
こちらでもビルドスクリプトにて各リンク先へとErrが表示されました。

他にどのあたりを気を付けてみればよいでしょうか。。。

> https://armadillo.atmark-techno.com/forum/armadillo/2289
> にあったようにビルド時にプロキシを与える方法をとってみましたが、
> こちらでも失敗しました。

このアプローチで正しいのですが、それでもエラーするとしたら
ご利用のプロキシサーバーは非TSLの接続を制限していないでしょうか?

aptはhttps対応していないため必ず非TLSでの接続になります。

pingはHTTPではなくICMPなのでICMPを制限するプロキシで
ない限り無関係に通過するので、コレを検証するにはhttp://な
サイトをwgetできるか確認してみてください。

ご利用のプロキシサーバーの仕様が分かると、より確実な説明が
できるのですが、状況から予想するとこれくらいです。

いろいろ試してみてとりあえず上手くいきました。
実行した内容としては次のようになります。

1.開発環境の通信はNATに設定。
2.有線設定へのプロキシは全て入力
3./etc/wgetrcへと値を記載。proxyを記載し、use_proxyパラメータをonに変更。apt.confは作成しない。
4.resources/fixupのapt-key部分について、--keyserver-optionにてプロキシを直接設定

どういう流れでできたのかはわかりませんが、とりあえずプロキシがあっても最後までbuildはできるように
なったようです。
お教えいただきありがとうございます。