bigmac-jp blog

web開発関連のメモ

Apache2.4系 アクセス許可設定

PHPのPhalconフレームワークをインストールした時に、
サーバへアクセスしても403が返却されてしまった。
Apacheの設定を見直しても改善されずに、いろいろと調べたら
Apache2.4系からアクセス許可の記述方法に変更があった。
単純に参考にしていた記事のApacheバージョンが2.2系??
だった。。。

変更前

<Directory "/usr/local/src/phalcon-sample/public">
        AllowOverride All
        Allow from all
</Directory>


変更後

<Directory "/usr/local/src/phalcon-sample/public">
        AllowOverride All
        Require all granted
</Directory>

AmazonLinux2 amazon-linux-extrasでPHPをインストール

Amazon マシンイメージ (AMI):Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-e99f4896


extras-libraryでインストール可能なリストは下記コマンドで確認できます。

# amazon-linux-extras
  0  ansible2                 available  [ =2.4.2 ]
  1  emacs                    available  [ =25.3 ]
  2  memcached1.5             available  [ =1.5.1 ]
  3  nginx1.12                available  [ =1.12.2 ]
  4  postgresql9.6            available  [ =9.6.6  =9.6.8 ]
  5  postgresql10             available  [ =10 ]
  6  python3                  available  [ =3.6.2 ]
  7  redis4.0                 available  [ =4.0.5  =4.0.10 ]
  8  R3.4                     available  [ =3.4.3 ]
  9  rust1                    available  \
        [ =1.22.1  =1.26.0  =1.26.1 ]
 10  vim                      available  [ =8.0 ]
 11  golang1.9                available  [ =1.9.2 ]
 12  ruby2.4                  available  [ =2.4.2  =2.4.4 ]
 13  nano                     available  [ =2.9.1 ]
 14  php7.2                   available  [ =7.2.0  =7.2.4  =7.2.5 ]
 15  lamp-mariadb10.2-php7.2  available  \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5 ]
 16  libreoffice              available  [ =5.0.6.2_15 ]
 17  gimp                     available  [ =2.8.22 ]
 18  docker=latest            enabled    [ =17.12.1  =18.03.1 ]
 19  mate-desktop1.x          available  [ =1.19.0  =1.20.0 ]
 20  GraphicsMagick1.3        available  [ =1.3.29 ]
 21  tomcat8.5                available  [ =8.5.31 ]

php7.2があることが確認できます。
Extras Library ではソフトウェアをトピックと呼ぶらしいです。
php7.2に紐づくトピックを下記コマンドで確認します。

# amazon-linux-extras info php7.2
php7.2 recommends php-cli                    # yum install php-cli
php7.2 recommends php-pdo                    # yum install php-pdo
php7.2 recommends php-fpm                    # yum install php-fpm
php7.2 recommends php-json                   # yum install php-json
php7.2 recommends php-mysqlnd                # yum install php-mysqlnd

トピックのインストールは下記コマンドで実行可能です

amazon-linux-extras install php7.2


インストール:
  php-cli.x86_64 0:7.2.5-3.amzn2.0.2            php-fpm.x86_64 0:7.2.5-3.amzn2.0.2        php-json.x86_64 0:7.2.5-3.amzn2.0.2       
  php-mysqlnd.x86_64 0:7.2.5-3.amzn2.0.2        php-pdo.x86_64 0:7.2.5-3.amzn2.0.2       

依存性関連をインストールしました:
  php-common.x86_64 0:7.2.5-3.amzn2.0.2                                                                                               

完了しました!
  0  ansible2                 available  [ =2.4.2 ]
  1  emacs                    available  [ =25.3 ]
  2  memcached1.5             available  [ =1.5.1 ]
  3  nginx1.12                available  [ =1.12.2 ]
  4  postgresql9.6            available  [ =9.6.6  =9.6.8 ]
  5  postgresql10             available  [ =10 ]
  6  python3                  available  [ =3.6.2 ]
  7  redis4.0                 available  [ =4.0.5  =4.0.10 ]
  8  R3.4                     available  [ =3.4.3 ]
  9  rust1                    available  \
        [ =1.22.1  =1.26.0  =1.26.1 ]
 10  vim                      available  [ =8.0 ]
 11  golang1.9                available  [ =1.9.2 ]
 12  ruby2.4                  available  [ =2.4.2  =2.4.4 ]
 13  nano                     available  [ =2.9.1 ]
 14  php7.2=latest            enabled    [ =7.2.0  =7.2.4  =7.2.5 ]
 15  lamp-mariadb10.2-php7.2  available  \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5 ]
 16  libreoffice              available  [ =5.0.6.2_15 ]
 17  gimp                     available  [ =2.8.22 ]
 18  docker=latest            enabled    [ =17.12.1  =18.03.1 ]
 19  mate-desktop1.x          available  [ =1.19.0  =1.20.0 ]
 20  GraphicsMagick1.3        available  [ =1.3.29 ]
 21  tomcat8.5                available  [ =8.5.31 ]

インストールされたphpのバージョンを確認

 php -v
PHP 7.2.5 (cli) (built: May 29 2018 19:08:12) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

AmazonLinuxでデフォルトリポジトリ調査

EC2マシンイメージ (AMI):
Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-9c9443e3

#yum repolist all
読み込んだプラグイン:priorities, update-motd, upgrade-helper
リポジトリー ID                            リポジトリー名                                                                  状態
amzn-main/latest                           amzn-main-Base                                                                  有効: 5,934
amzn-main-debuginfo/latest                 amzn-main-debuginfo                                                             無効
amzn-main-source/latest                    amzn-main-source                                                                無効
amzn-nosrc/latest                          amzn-nosrc-Base                                                                 無効
amzn-preview/latest                        amzn-preview-Base                                                               無効
amzn-preview-debuginfo/latest              amzn-preview-debuginfo                                                          無効
amzn-preview-source/latest                 amzn-preview-source                                                             無効
amzn-updates/latest                        amzn-updates-Base                                                               有効:   474
amzn-updates-debuginfo/latest              amzn-updates-debuginfo                                                          無効
amzn-updates-source/latest                 amzn-updates-source                                                             無効
epel/x86_64                                Extra Packages for Enterprise Linux 6 - x86_64                                  無効
epel-debuginfo/x86_64                      Extra Packages for Enterprise Linux 6 - x86_64 - Debug                          無効
epel-source/x86_64                         Extra Packages for Enterprise Linux 6 - x86_64 - Source                         無効
epel-testing/x86_64                        Extra Packages for Enterprise Linux 6 - Testing - x86_64                        無効
epel-testing-debuginfo/x86_64              Extra Packages for Enterprise Linux 6 - Testing - x86_64 - Debug                無効
epel-testing-source/x86_64                 Extra Packages for Enterprise Linux 6 - Testing - x86_64 - Source               無効
repolist: 6,408


EC2マシンイメージ (AMI):
Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-e99f4896

# yum repolist all
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリー ID                                       リポジトリー名                                                       状態
amzn2-core/2/x86_64                                   Amazon Linux 2 core repository                                       有効: 9,144
amzn2-core-debuginfo/2/x86_64                         Amazon Linux 2 core repository - debuginfo packages                  無効
amzn2-core-source/2                                   Amazon Linux 2 core repository - source packages                     無効
amzn2extra-docker/2/x86_64                            Amazon Extras repo for docker                                        有効:     5
amzn2extra-docker-debuginfo/2/x86_64                  Amazon Extras debuginfo repo for docker                              無効
amzn2extra-docker-source/2                            Amazon Extras source repo for docker                                 無効
repolist: 9,149

centos7.2 + Apache2.4 + php7 + cakephp3 + mysql5.6 で管理画面を作ります。 その5

centos7.2 + Apache2.4 + php7 + cakephp3 + mysql5.6 で管理画面を作ります。 その5


シンプルな認証機能を作る。メモとして書きます。
基本的はcakephpのAuthComponentを使うとほとんどやることをないです。
公式ドキュメントを参考にします。
シンプルな認証と認可のアプリケーション - 3.6



まずはMysqlにusersのTabelを作成します。
usersテーブルのにはログイン時のusernameとパスワードを保持させます。

CREATE TABLE users (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(255),
    role VARCHAR(20),
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

usersテーブルができたら、次はプログラムを作成します。
基本ベースはbakeコマンドでuserテーブルを指定して作成されたプログラムを修正していくイメージです。
bakeコマンドでとりあえずAllで全部ありで作ります。

bin/cake bake All Users
---------------------------------------------------------------
Baking table class for Users...

Bake All complete. 成功!!!!

次はAuthComponentを適用するためにsrc/Controller/AppController.phpに下記に修正します。
今回はログイン後のリダイレクト先コントローラーとアクションの指定と
ログアウト後のリダイレクト先の指定となります。
ログイン認証時に利用するカラム名がデフォルトのusernameとpasswordの場合は、記述の省略が可能です。ログインアカウント登録画面は認証が不要なので、beforeFilterで'add'を認証除外にしています。

    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('RequestHandler', ['enableBeforeRedirect' => false]);
        $this->loadComponent('Flash');
        // AuthComponentようの設定
        $this->loadComponent('Auth', [
            'loginRedirect' => [
                'controller' => 'Index',
                'action' => 'index'
            ],
            'logoutRedirect' => [
                'controller' => 'Users',
                'action' => 'login',
                'home'
            ]
        ]);
    }

    public function beforeFilter(Event $event)
   {
       $this->Auth->allow(['add']);
    }


次にアカウント登録処理を作成します。
先ほどのbakeコマンド実行でコンントローラーのaddアクション処理とテンンプレート(/Template/Users/add.ctp)、モデルのベースは作成済みです。ありがたいーーーーー。


パスワードの登録データは平文ではなく、ハッッシュ化されたものをUsersテーブルに登録するため、修正します。
_setPasswordで入力された平文パスワードをハッシュ化します。
/Model/Entity/User.php

//追加
use Cake\Auth\DefaultPasswordHasher;

class User extends Entity
{

 //追加
    protected function _setPassword($password)
    {
        if (strlen($password) > 0) {
            return (new DefaultPasswordHasher)->hash($password);
        }
    }
}

次はログイン画面を作ります。
bakeコマンドではログイン関連は作成されないため、Usersコントローラにloginアクションとlogoutアクションの追加とlogin.ctpテンンプレートを作成します。
/Controller/UsersController.php

   //追加
    public function login()
    {
        if ($this->request->is('post')) {
            $user = $this->Auth->identify();
            if ($user) {
                $this->Auth->setUser($user);
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error(__('Invalid username or password, try again'));
        }
    }
    //追加
    public function logout()
    {
        return $this->redirect($this->Auth->logout());
    }

/Template/Users/login.ctp

<!-- File: src/Template/Users/login.ctp -->

<div class="users form">
<?= $this->Flash->render() ?>
<?= $this->Form->create() ?>
    <fieldset>
        <legend><?= __('Please enter your username and password') ?></legend>
        <?= $this->Form->control('username') ?>
        <?= $this->Form->control('password') ?>
    </fieldset>
<?= $this->Form->button(__('Login')); ?>
<?= $this->Form->end() ?>
</div>

/users/addにブラウザでアクセスするとアカウント追加画面が表示される。
usernameとパスワードと権限)(1)を入力して登録するとusersテーブルにデータが登録される。
login画面でusernameとパスワードを入力すればログインができる。

centos7.2 + Apache2.4 + php7 + cakephp3 + mysql5.6 で管理画面を作ります。 その4

centos7.2 + Apache2.4 + php7 + cakephp3 + mysql5.6 で管理画面を作ります。 その4

cakephpにbootstrapテーマを適用します。メモとして書きます。

"bootstrap無料テーマ"とか検索したら、良さそうなテーマあるので、
今回は”SB Admin 2”ってやつを使います。シンプルで良さそう。
github.com

テーマをダウンロードして、展開する。

/pages/index.htmlをベースに使えそう。

/distと/vendorにjsとcssが格納されている。

cakephpでは/src/Template/Layout/default.ctpがデフォルトレイアウトファイルとして使われる。

/src/Template/Layout/default.ctp

<div class="container clearfix">
    <?= $this->fetch('content') ?>
</div>

"fetch('content') ?>"で各Actionで指定したテンプレート(index.ctp)が描画される。
”SB Admin 2”のindex.htmlをコードdefault.ctpに貼り付けて、メインエリアに下記を貼り付けたら、
いい感じになった。

<div class="container clearfix">
    <?= $this->fetch('content') ?>
</div>

ただし、index.htmlをそのまま貼り付け場合は、不要なダッシュボードのウィジェットがあるのでhtmlタグを削除するのと、cssやjsのパスをcakephp(/webroot)用に変更してあげる必要がある。
今回のテーマ以外でも上記の作業をしてあげれば、使えそう。

centos7.2 + Apache2.4 + php7 + cakephp3 + mysql5.6 で管理画面を作ります。 その3

centos7.2 + Apache2.4 + php7 + cakephp3 + mysql5.6 で管理画面を作ります。 その3

TOPページをとりあえず作ります。


MVCモデルのControllerを用意します。
$this->render('index');でレンダリングしたいViewを名前を指定する。
デフォルトではアクション名(index)のView(index.ctp)がレンダリングされる。
今回は明示的に指定している。本来は不要。
src/Controller/IndexController.php

<?php
namespace App\Controller;

use App\Controller\AppController;

class IndexController extends AppController
{
    /**
     * Index method
     *
     * @return \Cake\Http\Response|void
     */
    public function index()
    {
	    //index.ctpをレンダリング
	    $this->render('index');
    }
}

次にViewを用意する。ファイル名はControllerで指定したindex.ctp。
とりあえず空のviewを作ります。
src/Template/Index/index.ctp

<?php
/**
 * @var \App\View\AppView $this
 * @var \App\Model\Entity\User[]|\Cake\Collection\CollectionInterface $users
 */
?>
<a>index</a>

最後にルーティングの設定を変更します。
"/"でアクセスされた場合はデフォルトではPagesのControllerのdisplayのactionを指定している。
これを"/"でアクセスされた場合はIndexのControllerのindexのactionを呼び出すように変更する。
config/routes.php

routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
↓変更
$routes->connect('/', ['controller' => 'Index', 'action' => 'index']);

これで"/"アクセスした場合に、index.ctpが表示されます。

centos7.2 + Apache2.4 + php7 + cakephp3 + mysql5.6 で管理画面を作ります。 その2

centos7.2 + Apache2.4 + php7 + cakephp3 + mysql5.6 で管理画面を作ります。 その2

my_appデータベース作成

#mysql接続 rootユーザで前回設定したrootパスワードを入力
mysql -u root -p
#データベースを確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)

#my_appデータベースの作成
mysql> CREATE DATABASE my_app;
Query OK, 1 row affected (0.00 sec)

#データベースを確認 "my_app"が作成されていることを確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_app             |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

webrootディレクトリ移動&ドキュメントルートの変更

sudo vi /etc/httpd/conf/httpd.conf

変更
DocumentRoot "/var/www/cake/webroot" -> DocumentRoot "/var/www/cake"

変更(Directoryのパスと.htaccessの設定を無効化)
------------------------------------------------------------
<Directory "/var/www/cake">
AllowOverride All
</Directory>

↓
<Directory "/var/www/cake/webroot">
AllowOverride None
</Directory>
------------------------------------------------------------
#apache起動
sudo service httpd restart

.htaccessの無効化

cd /var/www/cake
ls la
sudo vi .htaccess
------------------------------------------------------------
変更
RewriteEngine  on -> RewriteEngine  off

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

.htaccessで設定した場合、リクエストがあるたびに.htaccessを探すので、
パフォーマンスは悪くなるらしい。