さくらのクラウドで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 !!!!

MovableType 4.27からWordpressへ移行したメモ

なんでこんなこと書くかというと、ツール -> インポート にある標準のプラグインだと動かなかったから。
あと、リダイレクト これが意外と大変でした。

使ったプラグイン

こいつらです。

上記のプラグイン入れれば手順書いてあるので以下は読み飛ばし可です

1. MTのバックアップ

該当のブログから ツール -> バックアップ でバックアップ

2. WPへプラグインのインストール

こいつ。 Movable Type Backup Importer

3. 指定のフォルダへアップロード

プラグインを適用したら指定されるんでそれの通りにすればおk。

4. あとはプラグインの指示通りでおk

あー、書くのめんどくさくなってしまったよ。

サムネイルが適用されない。。。

100%では無いけど、このプラグインで何とかなりました。

Automatic Post Thumbnail at SANIsoft

記事内の画像を消すなら、SQLで一括消したらいいんじゃないかな?やってないのでわからんけど。まあ最悪スクリプト組んじゃえ。

需要あれば重い腰をあげるかも。そんときゃコメント下さい。

リダイレクト

Redirection – Manage 301 redirections without modifying Apache

このプラグイン、無茶苦茶使える!!301リダイレクトとかしてくれるから超助かる。

例えば /hoge.html/hoge へ飛ばすには

正規表現にチェック
ソースURL     /(.*).html?$
ターゲットURL /$1/

といった感じ。

あと、Movable Type Backup Importer使うと、post-3post_3 とかになることがあるので、これも設定する。

正規表現にチェック
ソースURL      /-(.*)$
ターゲットURL /_$1/

みたいな。

あとはよしなに。。。

PHPカンファレンス関西2013へ行ってきた

でまあそこで Debugging and Profiling PHP てタイトルで 楽天のGraham Weldon氏がセッションされてたわけです。 すごい良い話だったのでまとめたいなぁ、と思ったんですが、どうも時間が取れないし、温度が下がってきちゃうので、備忘録だけ。あと、プロファイリングについても話されたたのですが、それはパスしてデバッグの話だけ。

デバッグについて

X-debug使ってるよね?

はい。phpcsで入れろと言われたので入れました。

んじゃ、デバッグvar_dumpとか使うな。

え?マジですか?それしか無いと思ってましたよ。

MacならCodebugがGUIで出来るからオススメ

(もうひとつアプリをおっしゃったんですが失念。。。)

設定方法

で、このあと設定方法なんかを解説されてたんですが、

  1. X-debug入れる
  2. Chrome Xdebug helper入れる

これが超楽だったのでこれにしました。

一応Codebug入れてみたんすけど、どうもvimmerな自分にはしっくり来ないので、探してみると、、、

Vim + Vdebug + Xdebug でPHPのリモートデバッグ | Code Life

こんな記事を見つけたので、もうあとはこっち見てもらえばいいやってんで終わります。

なにが良いの?

上記のブログでも書かれてますが、「なんでデバッグするのにコード書くんだ?」に尽きます。消し忘れるし、コード見にくいし。

僕なんかよくあるパターンですが、var_dump($hoge)したけど原因はそこじゃなくてvar_dump($fuga)だった場合。時間の無駄だなぁと。

ほかにも利点はたくさんだと思います。

おまけ

CakePHPでもおなじみの(多分このアイコン見たことあるはず)markstory (Mark Story)氏もブログに書かれてました。 Remote debugging with vim and xdebug | Mark Story

ってことで、これだけでも行った価値がかなりあったぞPHPカンファレンス関西2013、と。

あ、あと Graham Weldon 氏はかなり温和な感じの話し方の人だったので、上記のような強い語調ではないです。すげーやさしそうな人でした。