CentOS7にLaravelを構成するまでの簡易マニュアル

CentOS7にLaravelを構成するまでの簡易マニュアル

Dockerの上の構築に着手したため需要は半減しましたがメモとして記載します。

Dockerではなく、chef / puppet / ansible あたりを使うときにはこれをリストにして登録すれば使える様です。

CentOS7初期設定

ユーザーの追加

rootでログインした状態で

# useradd ユーザー名

パスワードを聞いてこないので自分から作りに行く。

# passwd ユーザー名

パスワードを聞いてくる。2回同じ値を記入

password: password

記載後 successfully が出てくれば完了

個人ユーザをwheelグループに参加させる。

sudoの許可

# usermod -G wheel ユーザー名

vimで login.defs を開き編集

# vim /etc/login.defs

開いた画面の最後にSUになれるユーザーの限定を追記

//Vimで開いた /etc/login.defs の最後に追記
・・・・
SU_WHEEL_ONLY yes

/etc/pam.d/su をVimで開く

# vim /etc/pam.d/su

6行目辺りのコメントアウトを外す

  #auth        required        pam_wheel.so use_uid
   ↓
  auth        required        pam_wheel.so use_uid

ROOTのSSHログイン防止

# vim /etc/ssh/sshd_config

39行目辺りの次の項目を変更

#PermitRootLogin yes
   ↓ 
PermitRootLogin no

selinuxを無効設定

# vim /etc/selinux/config

SELINUXの起動状態を修正する

  SELINUX=enforcing
    ↓
   SELINUX=disabled

※さくらのCentOS7インストールでは初期値が【disabled】になっている様子

一旦サーバーを再起動

# reboot

bash-completionパッケージのインストール

$ sudo yum install bash-completion

インストールできたか確認

$ yum list installed | grep bash-completion

bash-completion.noarch 1:2.1-6.el7 @base の様に出てきたら導入完了
※さくらのCentOS7インストールでは自動的にインストールされている様子

firewalld の設定

ファイヤーフォールを起動

$ sudo systemctl start firewalld

設定されているファイアウォールを確認する

$ sudo firewall-cmd --list-all

※初期値は dhcpv6-client ssh のみだと思われる。

http、https、pop3、pop3s、smtp、smtps、ftp、3306、8000ポートを許可する

$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent
$ sudo firewall-cmd --add-service=pop3 --permanent
$ sudo firewall-cmd --add-service=pop3s --permanent
$ sudo firewall-cmd --add-service=smtp --permanent
$ sudo firewall-cmd --add-service=smtps --permanent
$ sudo firewall-cmd --add-service=ftp --permanent
$ sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent //MYSQL用のポート 
$ sudo firewall-cmd --zone=public --add-port=8000/tcp --permanent //Laravel用のポート

--permanentを付ける事で恒久化する。一時的に開放したいときはこれを外せばOK。

設定が終わったら念のためサービスを再読込

$ sudo firewall-cmd --reload

設定の反映を確認

$ sudo firewall-cmd --list-all

※注意:さくらのサーバーの場合、Serverのコンソール画面で設定されているパケットフィルタで開いてない場合は出ていかない。

間違えて設定して削除するとき

$ sudo firewall-cmd --remove-port=3606/tcp

firewallの自動起動設定

$ sudo systemctl enable firewalld.service

//現状の確認は下コマンド
$ sudo systemctl is-enabled firewalld //結果がenabledならOK

日本語ロケールの設定

在のロケールの確認

$ localectl status

下の状態だと英語のロケールになっている

System Locale: LANG=C
VC Keymap: jp
X11 Layout: jp

ロケールの変更

$ sudo localectl set-locale LANG=ja_JP.utf8

$ localectl status して【 System Locale: LANG=ja_JP.utf8 】だったら成功

Apacheの設定

Apacheのインストール

$ sudo yum -y install httpd

Apacheの起動

$ sudo systemctl start httpd

確認したかったら以下のコマンドで

$ sudo systemctl status httpd

Apacheの自動起動を設定

$ sudo systemctl enabled httpd.service

※解除したいときは【systemctl disable サービス名.service】

remiレポジトリの追加

PHP5.4系が無い事を確認

$ sudo yum list installed | grep php

パッケージ情報が返ってきたら削除

$ sudo yum remove php*//PHPパッケージ

remiレポジトリの設定

$ sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

インストール成功の確認

$ cd /etc/yum.repos.d/
$ ls
//※ファイルがあればOK

remiレポジトリの追加の確認

$ sudo yum -y install --enablerepo=remi,remi-php73 php php-devel php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql

インストールされたPackageの確認

$ yum list installed | grep php

PHPの初期設定

行う事は下の4点

  1. 最低限のセキュリティ設定
  2. アップロードサイズの変更(2Mから20MBへ)
  3. タイムゾーンの設定
  4. マルチバイト対応(日本語対応)

念のため初期値のバックアップ

$ sudo cp -p /etc/php.ini /etc/php.ini.org

設定変更

$ sudo vim /etc/php.ini

----------
//アップロードサイズの変更(2Mから20MBへ)
#693行目
 post_max_size = 8M ⇒ post_max_size = 20M
#845行目
 upload_max_filesize = 2M ⇒ upload_max_filesize = 20M

//タイムゾーンアウト時間の変更
#873行目
 default_socket_timeout = 60 ⇒ default_socket_timeout = 240

//タイムゾーンの設定
#922行目
 ;date.timezone = ⇒ date.timezone ="Asia/Tokyo"

//マルチバイト対応(日本語対応)
#1535行目
 ;mbstring.language = Japanese ⇒ mbstring.language = Japanese
#1542行目
 ;mbstring.internal_encoding = ⇒ mbstring.internal_encoding = UTF-8
#1550行目
 ;mbstring.http_input = ⇒ UTF-8
#1560行目
 ;mbstring.http_output = ⇒ mbstring.http_output = pass
#1568行目
  ;mbstring.encoding_translation = Off ⇒ mbstring.encoding_translation = On
#1573行目
  ;mbstring.detect_order = auto ⇒ mbstring.detect_order = auto
#1578行目
  ;mbstring.substitute_character = none ⇒ mbstring.substitute_character = none
----------

採用を適応させるためService再起動

$ sudo systemctl restart httpd

httpd側にphpがモジュールとして組み込まれていることを確認

$ sudo httpd -M | grep php

php7_module (shared) が返されたら成功

MySQLのインストールと設定

MySQLのインストール

MariaDBのライブラリの消去

$ sudo yum remove mariadb-libs

MySQLのインストール

$ sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ sudo yum install -y mysql-community-server

サービスの起動と永続化

$ sudo systemctl start mysqld.service
$ sudo systemctl enable mysqld.service

rootの初期パスワードを確認

$ sudo grep password /var/log/mysqld.log

下の様に出てくる

2020-02-21T03:27:54.841071Z 5 [Note] [MY-010454] [Server]
A temporary password is generated for root@localhost: BmeQr<bsV0Ia

上のコマンドで出てきたrootのパスワード(BmeQr<bsV0Ia)を控えて変更

$ sudo mysql_secure_installation

パスワードを登録すると会順に5つの質問が出てくるので解答する。

# 変更したパスワード(ROOT)を確定するか     |y(確定して次へ)
# 匿名ユーザ( anonymous user )を削除するか |y(Success.と表示され削除完了)
# リモートから root ユーザでログイン禁止   |y(Success.と表示され禁止設定完了)
# test データベースの削除をするか       |y(Success.と表示され削除完了)
# 権限テーブルをリロードして変更を有効化      |y(Success.と表示され権限テーブルの変更を有効化)

MySQLの認証方法を変更

MySQLにログイン

$ mysql -u root -p

パスワードを聞かれるので先程変更したパスワードを記載してログイン

ROOTの認証方法を変更

mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'New_P@ssw0rd!';

今後作成するユーザーの方法も変更

$ sudo vim /etc/my.cnf

[mysqld]内に以下の内容を追記

default_authentication_plugin=mysql_native_password

//ポートを変更する時
port = 3330

MySQLに新規ユーザーとデータベースを登録

mysqlにrootでログインする

 $ mysql -u root -p //※エンター後パスを記載してログイン

ユーザーを追加

//同一サーバー内でログイン可能
create user 'user01'@'localhost' identified by 'password';
create user 'user01'@'127.0.0.1' identified by 'password';

//外部からのアクセス可能
create user 'user01'@'外部サーバーのIPアドレス' identified by 'password';
create user 'user01'@'外部サーバーのドメイン名' identified by 'password';

//どこからでもアクセス可能
create user 'user01'@'%' identified by 'password';

データベースの作成

CREATE DATABASE データベース名;

権限の設定

//全てのデータベースへのアクセスを許可
grant All on *.* to 'user01'@'localhost';

//データベース【sample】へのアクセスを許可
grant All on sample.* to 'user01'@'localhost';

//データベース【sample】の中のテーブル【test】へのみアクセスを許可
grant All on sample.test to 'user01'@'localhost';

Laravelの場合、.envなどでDataBaseへアクセスする際のユーザー名の設定がある。
この設定したuser名のユーザーを作成し適切な権限を与えてあげれば接続エラーは発生しない。

phpMyAdminのインストール

$ sudo yum --enablerepo=remi-php73 install phpmyadmin

phpMyAdminの設定を行う ※アクセス先とWEBでのアクセス許可を行う

$ sudo vim /etc/httpd/conf.d/phpMyAdmin.conf

アクセス先の変更(phpMyAdmin.conf内の8行目あたり)

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin
    ↓
Alias /php_my_admin_3948375823 /usr/share/phpMyAdmin
#Alias /phpmyadmin /usr/share/phpMyAdmin

変更前の設定ではhttp://【IP/Domain】/phpMyAdmin と http://【IP/Domain】/phpmyadmin で phpMyAdminが呼び出される。
この2つのアドレスは不正アクセスが非常に多いアドレスの為、絶対に変更が必要。
避けるべきURLについてはこちらをご参照ください ⇒ phpMyAdminを狙ったと思われる不正アクセスURL(攻撃対象URL)を晒します。

上の例では標準アドレスのアクセスでは404エラーとなり http://【IP/Domain】/php_my_admin_3948375823 でのアクセスへ変更している。
不正アクセス対策なので値は何でもよいが、推測されやすいものだけは避ける事。(以下:例)

Alias /php/my/admin/access/database /usr/share/phpMyAdmin ⇒ URL:http://【IP/Domain】/php/my/admin/access/database

phpMyAdmin.conf のその他設定変更

$ sudo vim /etc/httpd/conf.d/phpMyAdmin.conf

変更は設置の環境に合わせて行う。
以下の内容はCentOS7+SSL未設定の時の例。

  <Directory /usr/share/phpMyAdmin/>
     AddDefaultCharset UTF-8
#     SSLRequireSSL
     <IfModule mod_authz_core.c>
       # Apache 2.4
 #      <RequireAny>
 #        Require ip 127.0.0.1
 #        Require ip ::1
 #      </RequireAny>
        Require all granted
     </IfModule>
     <IfModule !mod_authz_core.c>
       # Apache 2.2
       Order Deny,Allow
       Deny from All
       Allow from 127.0.0.1
       Allow from ::1
     </IfModule>
  </Directory>

  <Directory /usr/share/phpMyAdmin/setup/>
     <IfModule mod_authz_core.c>
       # Apache 2.4
       Require local
#       <RequireAny>
#         Require ip 127.0.0.1
#         Require ip ::1
#       </RequireAny>
     </IfModule>
     <IfModule !mod_authz_core.c>
       # Apache 2.2
       Order Deny,Allow
       Deny from All
       Allow from 127.0.0.1
       Allow from ::1
     </IfModule>
  </Directory>

CentOS7+SSL設定の時の例は以下の通り。

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8
   SSLRequireSSL
   <IfModule mod_authz_core.c>
     # Apache 2.4
     Require all granted
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
</Directory>

<Directory /usr/share/phpMyAdmin/setup/>
   <IfModule mod_authz_core.c>
     # Apache 2.4
     Require local
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
</Directory>

別サーバーに元データがある時のデータベース移動

元サーバー(mysqldumpの後) から 新規サーバー(| sshの後)の 指定のDB(user2、password2)にテーブルをコピーする

$ mysqldump -u user2 -ppassword2 -n database01 | ssh user01@サーバーIP mysql -u user2 -ppassword2 database01 -P ポート番号

//以下条件の時の記述例
# HostサーバーのMySQLログインID:user01
# HostサーバーのMySQLログインパスワード:password01
# Hostサーバーのコピーしたいデータベース:DataBase01
# コピー先サーバーのIPアドレス:192.168.1.10
# コピー先サーバーのログインID:USER02
# コピー先サーバーのログインパスワード:PASSWORD02
# コピー先サーバーのMySQLログインID:user2
# コピー先サーバーのMySQLログインパスワード:password2
# コピー先サーバーのコピー先データベース:DataBase02
# コピー先サーバーのMySQLポート:3306

$ mysqldump -u user01 -ppassword01 -n DataBase01 | ssh USER02@192.168.1.10 mysql -u user2 -ppassword2 DataBase02 -P 3306

構築している状況によっては、パスワードまで含めてワンライナーで記載する事を怒られるときがある。
その場合は-p の後を空白にし、都度パスワードを入れていく方式をとる。
上の例の場合は、SSHの接続パスワードは聞かれるので打ち込みログイン処理をする。
※注意:コピー先サーバーからのアクセス(輸入)ではなくコピー元からのアクセス(輸出)であるため、コピー先のポート開放を忘れない事。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

と出てきてDBがコピーできない時。

SSH接続の【接続先サーバー情報(フィンガープリント)】が変わっている為これが邪魔してSSH接続が出来ない状態。
フィンガープリントを削除する事で想定の動きになる。

$ ssh-keygen -R 【接続するサーバーのIP】

参照サイト:https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938

HOST(コピー元)の DBへの新規サーバーからのアクセスを許可する

コピー元の特定のDBへのアクセスを許可する場合はコピー元での設定が必要。
※ユーザー作成時に 'user名'@'%' で作成している場合はどこからのアクセスも許可するため不要。

まずmysqlにログイン

mysql -u ユーザー名 -p

ログイン後、ユーザーの追加と権限設定

create user '【ユーザー名'@'【新規サーバーのIP】' identified by '【ログインパスワード】';
grant All on sales_app_announce.* to '【ユーザー名】'@'【新規サーバーのIP】';

Laravelインストールと設定

Laravelの動作にはcomposerが必須となるため、まずcomposerを入れる。

Composerのインストール

ダウンロードして名称変更・移動

$ sudo curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

Laravelのインストール

zipをインストール

$ sudo yum install -y zip unzip

システムの共通場所へ移動する。(インストールするための準備)

$ cd /var/www/html

保管場所はどこでもよい。
後で httpd.confで指示すればドキュメントルートに設定できるのでわかりやすい場所であれば問題ない。

ただし、homeの自分のディレクトリ内 cd  ~ だと別のユーザーから見る事が出来ず、システム修正に他者の力を借りる事が出来ないのでココだけは避ける。
自分で作る場合はパーミッションを 777でフォルダを用意する。
※後で775に変えても良いが777出ないと権限エラーが発生する

$ sudo mkdir -m 777 html
$ cd html

Laravelプロジェクトの作成

$ composer create-project laravel/laravel /var/www/html/プロジェクト名

Laravelプロジェクトの起動:これで8000ポートで動く

$ cd /var/www/html/プロジェクト名
$ nohup php artisan serve --host 0.0.0.0 > out.log 2> err.log < /dev/null &

http://サーバーIPアドレス:8000 へアクセスして初期画面が表示されるか確認する。

作成済みファイル(システム)のコピー

作成済みのLaravelデータがある場合は、Folder全体をそのまま新しいサーバーへコピーする。
コンソールを利用して他サーバから情報をコピー ※新規サーバー内での処理

//コピー先フォルダへ移動
$ cd /var/www/html/プロジェクト名/

//コピー実行
$ sudo scp -pr user01@コピー元IPアドレス:/var/www/html/プロジェクト名/ ./

※中途半端にデータの移動を実行するとエラーが多発し動かないので注意

うまくいかなかったらやり直し

//ディレクトリの削除
$ sudo rm -r /var/www/html/プロジェクト名

httpd.confの修正

設定を変更して80番でLaravelを稼働させる

$ sudo vim /etc/httpd/conf/httpd.conf

以降変更箇所

//86行目 ServerAdmin(連絡先メールアドレス)を変更 
ServerAdmin ****@***.*** //メールアドレスを変更

//119行目 DocumentRootを変更 
DocumentRoot "/var/www/html/プロジェクト名/public"

//123行目を変更 
<Directory "/var/www/html/プロジェクト名/public">

//131行目を変更 
<Directory "/var/www/html/プロジェクト名/public">

//247行目を変更 
ScriptAlias /cgi-bin/ "/var/www/html/cgi-bin/"

//255行目を変更 
<Directory "/var/www/html//cgi-bin/">

//末尾を変更
IncludeOptional /etc/httpd/conf.d/*.conf

Apacheを再起動

$ sudo systemctl restart httpd

ファイルの権限設定をする

この設定をしないと、logへの書き込みやキャッシュでエラーが発生するので忘れない事

権限グループを作りApacheを含めた必要なユーザーをこのグループに所属させる。
グループの作成

$ sudo groupadd PROJECT_NAME

グループにユーザーを所属

$ sudo gpasswd -a user01 PROJECT_NAME
$ sudo gpasswd -a apache PROJECT_NAME
$ sudo gpasswd -a USER02 PROJECT_NAME //外部から接続するユーザー

プロジェクトのディレクトリに移動

cd /var/www/html/PROJECT_NAME

ファイルのとフォルダのパーミッションを統一

$ sudo find ./ -type d -exec chmod 755 {} \;
$ sudo find ./ -type f -exec chmod 644 {} \;

storageとbootstrap/cacheの所有グループを変更

$ sudo chown -R :PROJECT_NAME ./storage
$ sudo chown -R :PROJECT_NAME ./bootstrap/cache

既存のディレクトリ・ファイルに対して変更

$ sudo find ./storage -type d -exec chmod 775 {} \;
$ sudo find ./storage -type f -exec chmod 664 {} \;
$ sudo find ./bootstrap/cache -type d -exec chmod 775 {} \;
$ sudo find ./bootstrap/cache -type f -exec chmod 664 {} \;

SGIDを設定し、誰がどう作成しようが、storage とbootstrap/cache に作成されたファイル・ディレクトリの所有グループをPROJECT_NAMEにする

$ sudo find ./storage -type d -exec chmod g+s {} \;
$ sudo gfind ./bootstrap/cache -type d -exec chmod g+s {} \;

ACLのデフォルト設定し、storageとbootstrap/cacheの配下に新規ファイルやディレクトリが作られるとき、ディレクトリは775に、ファイルは664に自動的に設定してくれるように設定

$ sudo setfacl -R -d -m g::rwx ./storage
$ sudo setfacl -R -d -m g::rwx ./bootstrap/cache

サーバーを再起動して設定を適応

$ sudo reboot

In trustedproxy.php line 66: Undefined class constant 'HEADER_CLIENT_IP' 対策

composer.jsonの値がLaravelと異なる事が原因で上記エラーが発生している。
コピー元のcomposer.jsonでコピー先を上書きし、その後 composer updateで修正。

#変更される箇所
"php": ">=7.1.3",
"fideloper/proxy": "^4.0",
"laravel/framework": "5.7.*",
"laravel/tinker": "~1.0",

Class 'Intervention\Image\ImageServiceProvider' not found 対策

画像エフェクトのプラグインが入っていないために発生している。
プラグインをインストールして終了

$ composer require intervention/image

他にもプラグインが足りない時同様【 Class 'Intervention\~~~~' not found】のエラーが発生するので、その都度対応する。

うまく起動しない時のcacheクリア

特に移動直後は【./bootstrap/cache/config.php】の影響などで起動しない時が多い。
その時はまず、キャッシュクリアを試す。

プロジェクトのディレクトリに移動

cd /var/www/html/PROJECT_NAME

すべてのcacheを削除

$ php artisan optimize:clear

//個別に削除する場合は以下のコマンド
$ php artisan clear-compiled
$ php artisan config:clear
$ php artisan route:clear
$ php artisan cache:clear
$ php artisan view:clear

viewを除くすべてのcacheを作成

$ php artisan optimize

//個別に作成するときは以下のコマンド
$ php artisan config:cache
$ php artisan route:cache

Viewのcacheを作成

$ php artisan view:cach

カーボンのインストール

使っている所でしかエラーが出ないため忘れがちになるが忘れない事。
使っていない場合は無視してよい。

$ composer require nesbot/carbon

参考サイト

https://www.rem-system.com/centos-httpd-php73/

まとめ

Server立ち上げからLaravelのコピーまで、とりあえずこれで一通り可能です。

Dockerでの構築の場合はちょっと変わってくるため現在修行中。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください