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側は別途ローカルスイッチを作成し、ローカルからアクセスすることとした。
内容はここと全く同じ。
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/*;
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を操作しようとしたことがありましたが、ライブラリ使ったほうが安心できます。この頃はライブラリという言葉すらよくわかってなかったんで、若気の至りです。
で、実際の処理ですがこんな感じ。
- FTP接続する
- ディレクトリ内のファイルを検索する
- ファイル名を
/(.html|.htm)$/
って感じで正規表現で調べる - 見つかったら
str_replace
で単純にhttp://
をhttps://
に置き換え - ファイルをその内容で上書きする
- カレントディレクトリのディレクトリ一覧を取得する
- 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でしょ!?ってことで。
当日のスライド一覧
- Dive into the Cloud with our buddy, lovely PHP! @omoon
- AWS SDK for PHPをインストールするならComposerでしょ!@slywalker
- いまどきのPHP@shin1x1
用意するもの
必須
- Git
あると便利
今回は手元のGitをdeployするだけなので、Clientからの操作で説明します。Webからの処理が意外と不便だったってのもありますが。。。
Demo
自分と言えばヤフオク、ヤフオクといえば俺、みたいなところがあるので、ヤフオクネタで作ってみました。開くとYConnect(Yahoo! Japan oauth2.0)で認証取りに行って、出品中一覧を表示します。
読み込みにやたらと時間がかかるのだけど、YConnectにいきなり接続しに行くからかな?この辺課題だなぁ。
作業手順
1) てきとーにプロジェクトを作る
Demoそのまま使うのであればgithubにpagodabox
branchで置いたのでそれをクローン。
➜ ~ 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の管理画面からの場合は別途git
のremote
を設定する必要あり
ここ参照
➜ 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 !!!!