Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

Webサーバー構築(Apache+PHP) の練習

ちょっとお仕事で

AWS上のインスタンスを用いて

*既定の入力フォーマットでいろいろな人から入力を集めて

*入力結果を保存して

AWS S3やslack botに入力結果の保存内容を投げる

ということがしたくなったので、webサーバを構築してみる

 

AWSインスタンス

まずサーバとなるインスタンスを立てる。

IPv4パブリックIPを与えること

*セキュリティグループで会社内ネットワークのIPからHTTPアクセスを許可する

だけ忘れずに設定する。後者は後でも追加可能。

仮にパブリックIPが12.345.6.78だとする

Apache

まず基本であろうApache(httpd)でウェブサーバサービスを立てる

sudo yum install httpd

sudo service httpd start

これでひとまずAWSインスタンス上でhttpdサービスがスタートした。

これだけで、会社内ネットワーク上のマシンから、ブラウザで

12.345.6.78

と入力すると、apache server testページが出てくる。やったね!

 

特別portの指定

/etc/httpd/conf/httpd.conf内のListen項目に

Listen 8080

を追加してからhttpdをrestartすると、

12.345.6.78:8080

でも行けるようになるね。使うライブラリとか、排他的な制御とかそういうときにport番号指定したりするときはこうする?

 

自前html!

httpd.confを見ると

DocumentRoot "/var/www/html"

となっています。ので、http://12.345.6.78はこのパスを実際には見ることになります。

日本語コーデックの確認も兼ねて、

centossrv.com

を参考にさせていただいて、簡単htmlを置きましょう。

sudo emacs /var/www/html/sample.html

 

[sample.html] 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>テスト</title>
</head>
<body>
テスト
</body>
</html>

これで

12.345.6.78:8080/sample.html

にアクセスします。

「テスト」とだけ表示されるページができたら成功ですね!

 

入力フォームつくるー

まずはテキストボックスしかないページを作るぞー

 

htmlで入力したデータをサーバ側に送信する方法 その1

5.1 HTMLフォームを使ったデータの入力とWebサーバ側での受信

こういうページを参考にしますよー

 

今回の目標

翻訳の失敗例を集めたい!ので

*ユーザさんに「翻訳クエリ」と「失敗した翻訳結果」を入力してもらう

*ボタンを押すと2つがまとめて保存なり送信される

という機能がほしいですね。

 

ページの要素として

*テキストボックスが2つ

*送信するボタン

の2つが必要です。これはhtml内の<form>タグを作って、その中に

テキストボックス2つとボタン1つを配置して完了します。

<form action="collection.php" method="POST" enctype="multipart/form-data">

<table>
<tr>
<td>
<textarea name="input" rows="3" cols="100" placeholder="翻訳に失敗した入力文章をここに入れてください(500文字以内)。" maxlength="500"\
class="form-control"></textarea>
</td>
<td>
<textarea name="output" rows="3" cols="100" placeholder="失敗した翻訳結果をここに入力してください(500文字以内)。" maxlength="500" cl\
ass="form-control"></textarea>
</td>
</tr>
</table>

<p>
<button type="submit" class="btn btn-primary btn-lg"> 報告するマン!! </button>
</p>
</form>

 

アクション機能として

*ボタンを押すと2つのテキストボックスの内容を取得する

*確認用に受け取った2つの内容を表示する

が必要です。

機能部分はPHPで書くのが簡単っぽい?ので、phpのファイルを作成して処理させます。

フォームからの入力 | PHP Labo

 

まずPHPを動かすようにします(これに気づかず2時間溶けた)

sudo yum install php

 

sudo emacs /etc/httpd/conf/httpd.conf

AddType application/x-httpd-php .php  と追記

 を追加。

で、collection.phpをhtmlと同じ場所において、

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sample</title>
</head>
<body>
<table border="1">
<p>
<p>
<tr>
<td>翻訳クエリ</td><td><?php echo htmlspecialchars($_POST["query"], ENT_QUOTES); ?></td>
</tr>
<tr>
<td>誤訳結果</td><td><?php echo htmlspecialchars($_POST["translated"] , ENT_QUOTES); ?></td>
</tr>
</table>
</body>
</html>

これで、報告すると報告結果がブラウザにでるようになります.

 

入力された内容を保存したいー

 これでpostでデータの受け渡しはできるようになったけども、このままだと送信のたびにページが切り替わってしまう。

そこで*送信結果の表示の裏で、ファイルに送信結果を書きだす

これができるようになりたい。

 

これで行けた。

【PHP】フォームから送信された情報をファイルに保存する方法

# collection.php

 

# 上記の</table>と</body>の間に以下を挿入します

<!-- sent to the file-->
<?php
if ( isset($_POST["query"]) && ($_POST["query"] != "") ) {

$query = $_POST["query"];
if( get_magic_quotes_gpc() ) { $query = stripslashes("$query"); } // Escaping quotes
$query = htmlspecialchars ($query); // prohibit HTML tags
print "query=$query \n ";

if ( isset($_POST["translated"]) ) {
$translated = $_POST["translated"];
if( get_magic_quotes_gpc() ) { $translated = stripslashes("$translated"); } // Escaping quotes
$translated = htmlspecialchars ($translated); // prohibit HTML tags
print "translated=$translated \n ";
}

$time = date("Y/n/j G:i"); //日時の取得
$write = $time . ", " . $query . ",". $translated . "/";
$log = fopen ("log.txt","a"); // open with write mode
flock ($log, LOCK_EX); // lock the output file
fputs ($log,$write); // file write
flock ($log, LOCK_UN); // unlock the output file
fclose ($log); // close
}
?>

<p>
<h3>Above content is sent to the file. thanks.</h3>
<p>

 

これで、/var/www/html/log.txtに書き込まれるはずです。

 

・・・できませんでした

SE linux!!

/var/www/htmlは通常rootのものなので、apacheさんなどには書き込めません。

そこで

Apache - Apacheのドキュメントルートのパーミッションと所有権に関して(2111)|teratail

などを参考にしてパーミッションを変えます。

groupadd apache

usermod -a -G apache apache
usermod -a -G apache centos

chown root:apache /var/www/html/ 
 
chmod 2775 /var/www/html/ -R 

 

これでも書けないので、SE Linuxを疑います。

ApacheでSELinuxが原因で403 Forbiddenエラー - カタカタブログ

 

sudo setenforce 0 # SElinux一時停止

 これで・・・書き込める!やっぱSE linuxのせいだった!

 

画面切り替えたくない!

ひとまず入力フォームの入力内容を書きだせるようになったけど、

今は送信のたびに画面が変わるのでたくさん書いてもらうには面倒。

そこで、

*送信してもページが切り替わらないで、「送信したよ!」とだけ表示が増える

*つづけて送信できる

 としたい。

 

簡単には、sample.phpの中で直接php処理を全部書いてしまえばよい。

具体的にはsample.phpの中の次の文を書き換えて・・・

<form action="collection.php" method="POST" enctype="multipart/form-data"> 

-->

<form action="sample.php" method="POST" enctype="multipart/form-data"> 

 にして、collection.phpの中の実際にphp処理する部分をそのままsample.phpの中に書けばOK.

 

AWSやSlackへの投稿は次の記事に続く(かもしれない)