CentOS7にPHP74, PostgreSQL12, MariaDB10.4をインストールする

PostgreSQL12

12用のリポをゲットしてインストール。

yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -y install postgresql12-server postgresql12-contrib
cp /var/lib/pgsql/12/data/pg_hba.conf /var/lib/pgsql/12/data/pg_hba.conf.org
vi /var/lib/pgsql/12/data/pg_hba.conf
diff /var/lib/pgsql/12/data/pg_hba.conf.org /var/lib/pgsql/12/data/pg_hba.conf

編集した差分はこちら。ローカルかつ特定のユーザーからしかアクセスできないように設定。

84c84
< local   all             all                                     peer
---
> local   all             all                                     trust
86c86
< host    all             all             127.0.0.1/32            ident
---
> host    all             <dbusername>       127.0.0.1/32            md5
88c88
< host    all             all             ::1/128                 ident
---
> #host    all             all             ::1/128                 ident
91,93c91,93
< local   replication     all                                     peer
< host    replication     all             127.0.0.1/32            ident
< host    replication     all             ::1/128                 ident
---
> #local   replication     all                                     peer
> #host    replication     all             127.0.0.1/32            ident
> #host    replication     all             ::1/128                 ident

データベースの初期化。

PGSETUP_INITDB_OPTIONS="-E UTF8 --no-locale" /usr/pgsql-12/bin/postgresql-12-setup initdb
su - postgres
psql

ユーザーの追加。権限の変更。ユーザー一覧の確認。

CREATE ROLE <dbusername> CREATEDB LOGIN PASSWORD '<dbpassword>';
ALTER USER kir014912 SUPERUSER;
\du;

rootに戻ってサービスの登録と起動。ファイヤーウォールの設定。

firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --permanent --zone=public --add-service=postgresql
systemctl restart firewalld.service
firewall-cmd --list-all
systemctl enable postgresql-12.service
systemctl start postgresql-12

MariaDB10.4

以下のリポジトリにバージョン指定すればインストール指定したバージョンでインストールが可能。インストール後は初期設定。

curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash -s -- --mariadb-server-version=mariadb-10.4
yum install -y MariaDB-server MariaDB-client
mysql_secure_installation

初期設定はrootのパスワード設定以外はだいたいYesで。

cp /etc/my.cnf.d/mariadb-server.cnf /etc/my.cnf.d/mariadb-server.cnf.org
vi /etc/my.cnf.d/mariadb-server.cnf
diff  /etc/my.cnf.d/server.cnf.org  /etc/my.cnf.d/server.cnf

[mysqld] 以下に追記。

12a13,15
> character-set-server = utf8mb4
> [client-mariadb]
> default-character-set = utf8mb4

サービス登録と起動、ファイヤーウォールの設定。

systemctl enable mariadb
systemctl start mariadb
firewall-cmd --permanent --zone=public --add-service=mysql
systemctl restart firewalld.service
firewall-cmd --list-all

PHP74

epelリポジトリからPHP74のインストール。ipaフォントはプロジェクトで使うのでついでに入れてます。

yum install -y epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install -y --enablerepo=remi-php74 php php-mysql php-pgsql httpd-tools php-curl php-dom php-gd php-pecl-imagick php-zip  php-mbstring php-openssl php-xml unzip ipa-gothic-fonts ipa-pgothic-fonts fontconfig
php -v

composer なしにはPHPで何もできないように思うので初めから入れておく。

cd /usr/local/src/
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer

さくらのクラウドでCentOS7を導入したメモ - その3

ロードバランサの設定

スイッチ+ルーター にロードバランサの構成とした。WEB側のサーバーのみロードバランサを利用し、DB側は別途ローカルスイッチを作成し、ローカルからアクセスすることとした。

内容はここと全く同じ。

manual.sakura.ad.jp

cp /etc/sysctl.conf /etc/sysctl.conf.org
vi /etc/sysctl.conf

以下を追記する。

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

反映

sysctl -p

バイスの追加

/etc/sysconfig/network-scripts/ifcfg-lo:0

以下を記述。

DEVICE=lo:0
IPADDR=仮想IPアドレス
NETMASK=255.255.255.255

反映

ifup lo:0

さくらのクラウドでCentOS7を導入したメモ - その2

IPアドレスの設定(ローカルスイッチ)

ip addr
vi /etc/sysconfig/network-scripts/ifcfg-eth1

eth1の設定がなかったので追加

DEVICE=eth1
BOOTPROTO=static
DEVICE=eth1
BOOTPROTO=static
ONBOOT=yes
GATEWAY=192.168.0.1
PREFIX=24
IPADDR=192.168.0.<*>

設定の反映と確認

systemctl restart NetworkManager
systemctl restart network
nmcli d

phpのインストールと設定

yum install -y epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install -y --enablerepo=remi-php74 php php-fpm php-mysql php-pgsql httpd-tools php-curl php-dom php-gd php-pecl-imagick php-zip  php-mbstring php-openssl php-xml unzip ipa-gothic-fonts ipa-pgothic-fonts fontconfig
systemctl enable php-fpm
systemctl start php-fpm
mkdir /run/php
vi /etc/php-fpm.d/www.conf

以下変更

user = nginx
group = nginx
listen = /run/php/php7.4-fpm.sock
listen.owner = www
listen.group = www

ソースコンパイルのnginxだとlistenが違ってるが、yumで構築した環境からの移行なので、パスを揃える。起動時に /run/php が作られるように設定。

vi /etc/tmpfiles.d/php-fpm.conf

以下を記述。

d /run/php 0755 www www

yumの設定をそのままコピー

mkdir /etc/nginx/conf/snippets
vi /etc/nginx/conf/snippets/fastcgi-php.conf

phpの設定をコピペ

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

Let's Encryptのインストールと設定

yum -y install certbot

旧サーバーから /etc/letsencrypt ディレクトリ以下一式持ってくる。
*自動更新のcronはサイト移転終わってからやる。

nginxの設定

ユーザーの追加

useradd -s /sbin/nologin www
passwd www
mkdir /var/www
chown -R www:www /var/www
mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled 
cd /etc/nginx
cp conf/nginx.conf conf/nginx.conf.org
vi conf/nginx.conf

追記、変更

user  www;
worker_processes  auto;
http {
server_tokens off;
##
# Gzip Settings
##

gzip on;

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

Basic認証

htpasswd -c /etc/nginx/.htpasswd username

nginxとphp-fpm再起動

systemctl restart nginx
systemctl restart php-fpm

composerインストール

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer

さくらのクラウドでCentOS7を導入したメモ - その1

ログインユーザーの追加とSSHの設定

ユーザーの追加

useradd <username>
passwd <username>
usermod -G wheel <username>

SSHの設定

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
vi /etc/ssh/sshd_config

以下の部分をnoに変更

PermitRootLogin no 
PasswordAuthentication no

保存したら

systemctl restart sshd
su - <username>

ここからログインユーザー側

mkdir .ssh
chmod 700 .ssh
vi ~/.ssh/authorized_keys

認証キー追加したら

chmod 600 ~/.ssh/authorized_keys

SiteGuardの導入

さくらのVPSさくらのクラウドではSiteGuardが無償提供されています。スタートアップスクリプトが残念ながらApacheバージョンでしたので手動で導入。

cd /usr/local/src
curl -OL <SiteGuard Server Edition のインストールファイル>
tar -zxvf siteguard-server-edition-*****.tar.gz
cd siteguard-server-edition-****
make install

SiteGuardのプラグインを導入するため、nginxはソースからコンパイルする必要があります。 ここ注意。あと、、、めんどくさい。

必要なライブラリを入れてきます。詳しく調べてないけど、OpenSSLは1.1.1を入れた方がよさそうだったのでソースからコンパイル

yum install -y zlib-devel pcre-devel apr-devel apr-util-devel java-1.8.0-openjdk
cd /usr/local/src
curl -OL https://www.openssl.org/source/openssl-1.1.1j.tar.gz
tar -zxvf openssl-1.1.1j.tar.gz
./config --prefix=/usr/local/openssl-1.1.1 shared zlib
make depend
make
make install
vi /etc/ld.so.conf.d/openssl-1.1.1.conf

以下を追加

/usr/local/openssl-1.1.1/lib

保存して反映。

ldconfig

ようやくnginxをインストール

cd /usr/local/src
curl -OL http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure --add-module=/opt/jp-secure/siteguardlite/nginx --with-http_ssl_module --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --with-openssl=/usr/local/src/openssl-1.1.1j
make
make install

systemdの設定

vi /usr/lib/systemd/system/nginx.service

以下を記述。

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/etc/nginx/logs/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

登録、自動起動

systemctl start nginx
systemctl enable nginx

これで最後、SiteGuardのセットアップ。

cd /opt/jp-secure/siteguardlite/
./setup.sh

ファイヤーウォールの設定をすれば終了。

firewall-cmd --list-all
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --add-port=9443/tcp --zone=public --permanent
firewall-cmd --reload

僕が考えた最強の文字コード設定

エンコードと関係ない設定もあるけどこれ。pnp.iniで設定したいんですが、サーバー側の設定でできなかったりするのでとりあえずこれを持っとくと安心。

gist7f513df2a9e05b98ce992abc468618d1

とか とか機種依存文字が超辛かった(eucJP-win -> UTF-8)けど、これでなんとか乗り越えられそう。5年以上のつらみがこれで乗り越えられたら良いのだけど。。。

楽天Goldの常時SSL化対応が面倒なのでスクリプト書いた

突然お客様から電話。楽天から電話があって、どうしていいのかわからないのでお願い、とのこと。内容はこう。

「2017年の6月末だかいつだかわかんないですけど、ともかく 常時SSL します、対応しないと 表示できなくなりますよ って脅されました。」

脅されてるかどうかは別として超めんどくさいな、ってのは想像がつく。商品ページの方は、楽天から紹介されたWEBサービスで対応できたみたいだけど、楽天GOLDへアップしたhtmlファイルのリンクを変更しないといけないらしい。ただ、ラッキーなことに楽天GOLDにアップしてるhtmlファイル内のリンクはほとんど楽天ドメインばかり。じゃあもう単純に http://https:// でよいのでは?ってことで済ませちゃった。なので、もしかすると需要は少ないかもしれませんが、誰かの役に立てば。

使い方

composer使える前提です。なので普段楽天の商品ページいじったりしてるだけの人には少々ハードル高いかも。

git clone https://github.com/comeonly/rakuten_gold_ssl
compose install

でインストール。

あとは、スクリプトを実行するだけ。

php run.php <ftp_username> <ftp_password>

ってな感じで引数にftpのユーザー名とパスワードを入れてください。直接FTPで接続してhtmlファイルを再帰的に検索しながら文字列置き換えして、ファイルを上書き保存してくれます。

で、実際どのリンクが置き換えられるかわからないことが起こりそうなので、ドライランのオプションも付けました。

php run.php <ftp_username> <ftp_password> dry

これで対象リンクとそのファイルの有るパスが一覧で表示されます。これを元に手動でやるっててもなくもないです。

中身どうなってんの?

touki/ftpってライブラリをpackagistで見つけたので使わせて頂きました。昔にこんな記事を書いて自力でFTPを操作しようとしたことがありましたが、ライブラリ使ったほうが安心できます。この頃はライブラリという言葉すらよくわかってなかったんで、若気の至りです。

comeonly.hatenablog.com

で、実際の処理ですがこんな感じ。

  1. FTP接続する
  2. ディレクトリ内のファイルを検索する
  3. ファイル名を /(.html|.htm)$/ って感じで正規表現で調べる
  4. 見つかったら str_replace で単純に http://https:// に置き換え
  5. ファイルをその内容で上書きする
  6. カレントディレクトリのディレクトリ一覧を取得する
  7. 2.に戻って再帰的にじゃんじゃんやっつけていく

とまあ超単純なスクリプトです。FTPって再帰的な処理ができないのでこういうライブラリつかって一覧を簡単に取得できると楽で良いですね。

アディオス!

ComposerとPagoda Boxで今どきなDeployしたらモテ期到来で彼女が出来ました

うそです。

JAWS FESTA Kansai 2013へ行って来たんですが、関西PHP勉強会でAWSと関係のないものを習得してきましたよwという話。 大きくは2点で、@omoonさんのSaaSの話。HerokuなどのSaaS全盛期の中、PHPのSasSであるPagoda Boxなるものがあるらしい。ってのと@slywalkerさんのComposerの話。これも今流行のパッケージ管理の話でJSなどのフロントエンドパッケージ管理ツールのBOWERなんかがありますが、PHPならComposerでしょ!?ってことで。

当日のスライド一覧

用意するもの

必須

  • Git

あると便利

今回は手元のGitをdeployするだけなので、Clientからの操作で説明します。Webからの処理が意外と不便だったってのもありますが。。。

Demo

自分と言えばヤフオク、ヤフオクといえば俺、みたいなところがあるので、ヤフオクネタで作ってみました。開くとYConnect(Yahoo! Japan oauth2.0)で認証取りに行って、出品中一覧を表示します。

YCoonect Demo

読み込みにやたらと時間がかかるのだけど、YConnectにいきなり接続しに行くからかな?この辺課題だなぁ。

作業手順

1) てきとーにプロジェクトを作る

Demoそのまま使うのであればgithubにpagodaboxbranchで置いたのでそれをクローン。

➜  ~  git clone -b pagodabox https://github.com/comeonly/YConnectDemo.git

2) Pagoda BoxのSSH設定をする(初回のみ)

ここ参照 Pagoda Box Portal | Deploy and Scale PHP Apps Setting Up Git - Mac

3) Pagoda BoxでNew Appする

➜  ~  cd YConnectDemo
➜  YConnectDemo git:(pagodabox)  pagoda create

*Webの管理画面からの場合は別途gitremoteを設定する必要あり ここ参照

➜  YConnectDemo git:(pagodabox)  git remote add pagoda git@git.pagodabox.com:yconnect-demo.git

4) Deployする

➜  YConnectDemo git:(pagodabox)  pagoda deploy

Helpの記事にはpagoda deploy -b [brandch neme]的なことを書いていますが、そんなオプションないよと言われますし、pagoda deploy -hでもこんなのしかでません。

➜  ~  pagoda deploy -h
Usage: pagoda [options]
    -a, --app VAL

deployしたいbranchにいれば、そのbranchでdeployされる仕様みたいです。

勘所

「そんなBoxfileで大丈夫か?」

Boxfileの設定がさっぱりわかんなくてかなりハマった。

web1:
  name: yconnect-demo   #app名(無くても良いっぽい)
  shared_writable_dirs: #書き込み可能なディレクトリ
    - tmp
  php_extensions:       #PHPの設定
    - curl              #composerインストールするのとOauthに必要
    - zip               #composerでパッケージを開くのに必要
    - intl              #composerに必要っぽい
  after_build:          #サーバーのビルドが終わったあと実行する(bash)
    #composerのダウンロード
    - "curl -sS https://getcomposer.org/installer | php"
    #composerのインストール
    - "php composer.phar install"
    #opauthのyconnect用pluginのファイル名修正
    - "mv vendor/opauth/yahoojp/YahoojpStrategy.php vendor/opauth/yahoojp/yahoojpStrategy.php"

enjoy it !!!!