ConoHaで「Photon」を動かす


この記事は、ConoHa Advent Calendar 2020 15日目の記事です。
今回は清楚かわいい ConoHa ちゃんをボクだけのPhotonサーバにしていきます。

Photonって何ぞ??

WordPress公式が提供する画像変換サービスのことです。(ん?)
何ができるかというと

こんな感じの画像を
https://conoha.mikumo.com/wp-content/uploads/2020/11/1280x800-1.jpg

alt

こう書き換えると
https://i0.wp.com/conoha.mikumo.com/wp-content/uploads/2020/11/1280x800-1.jpg?&w=500

こんな感じでリサイズしたり
alt

切り抜いたり

https://i0.wp.com/conoha.mikumo.com/wp-content/uploads/2020/11/1280x800-1.jpg?&crop=30,10,40,60

alt

してくれます。

APIも提供されているので、色々なことに使えてしかも無料という太っ腹サービスですが、一点制約があり

Photon is only allowed to be used by sites hosted on WordPress.com, or on Jetpack-connected WordPress sites

WordPress.comのクラウドサービスか、WordPressでかつ「Jetpack」というプラグインをインストールしたサイトしか使えません。
(URL書換で動くので無断で使えますが、突然エラーになったりするのでやめましょう)

そのため、レンタルサーバーでホームページを運営している方や、ブログサービスやnoteだったりを使っている方は使用できません。画像変換サービスとしては(!)

そう!実はこの Photon はソースコードが公開されているのでサーバを用意してセットアップすれば自由に使えます。

photon ? WordPress Code Trac

ただしソースコードが公開されているだけで依存関係だったり、導入手順だったりは一切公開されていないので、
自分で必要なものを確認して、自分で考えてセットアップが必要です。

今回はこのOSS版?Photonのセットアップに成功したので、ConoHaを使って画像変換サーバを作ろう!!というお話です。

サーバをつくる

早速 ConoHa ダッシュボードにログインしてサクッとサーバー立てます。

OSも特に要件がない(多分)ので、定番の1GBプランでCentOS8.2をチョイス

去年は50GBだったのに、今年は100GBに増えてる!!)

ログインしてセットアップ

SVNで公開されているソースコードを見ながら必要そうなものを追加していきます。

の前にお約束

dnf -y update

あとファイヤーウォールも止めます
きちんと使用する場合は特定ポートだけ解放するか、ConoHa側のFWを設定してください!

systemctl stop firewalld

ミドルウェアのセットアップ

Photonが稼働するミドルウェアを導入。今回は Nginx と PHP をインストールします。
たぶん Apache でも動きます。

Nginx

HTTPSに対応させたいので一旦最低限の設定ファイルを配置して、Let's Encryptで証明書発行後に置き換えます。

dnf install -y nginx
mkdir -p /var/www
mkdir -p /var/lib/nginx/fastcgi
cd /etc/nginx/
mv nginx.conf nginx.conf.backup
vi nginx.conf

Configはこちらを丸っとコピペ

nginx.conf
user              nginx;
worker_processes auto;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  2048;
    multi_accept on;
    use epoll;
}
http {
    include       /etc/nginx/mime.types;
    access_log  /var/log/nginx/access.log;
    keepalive_timeout 5;
    client_max_body_size    10m;
    server_tokens     off;
    server_name_in_redirect off;
    index index.html index.php;

    server {
        listen       80  default_server;
        server_name  _;
        root        /var/www/;
    }
}

PHP

バージョンは推測できなかったので、とりあえず最新版をインストール

dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module install -y php:remi-7.4

sed -i 's/apache/nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/listen = \/run\/php-fpm\/www.sock/listen = \/var\/run\/php-fpm\/php-fpm.sock/g' /etc/php-fpm.d/www.conf
sed -i 's/listen.mode = 0660/listen.mode = 0660\nlisten.owner = nginx\nlisten.group = nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/listen.acl_users/;listen.acl_users/g' /etc/php-fpm.d/www.conf
sed -i 's/;clear_env = no/clear_env = no/g' /etc/php-fpm.d/www.conf
chown -R nginx:nginx /var/lib/php/
chown -R nginx:nginx /var/www

画像変換に使うライブラリだったりをインストール

dnf install -y make php-devel php-pear GraphicsMagick-devel
pecl install gmagick-2.0.5RC1
echo "extension=gmagick.so" > /etc/php.d/20-gmagick.ini

開始と自動起動

systemctl start php-fpm.service
systemctl start nginx.service
systemctl enable php-fpm.service
systemctl enable nginx.service

Let's Encrypt

certbotがなぜがエラーになるので git からクローンしてセットアップ

dnf install -y git
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
# photon.cloudremix.net はお使いのドメインで
./letsencrypt-auto certonly --webroot -w /var/www -d photon.cloudremix.net

openssl dhparam -out /etc/nginx/dhparam.pem 2048

正常に証明書の発行が終わったら Nginx の設定を本来のものに

vi /etc/nginx/nginx.conf

こちらを丸っとコピペ(クリックで表示)
nginx.conf
user              nginx;
worker_processes auto;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  2048;
    multi_accept on;
    use epoll;
}
http {
    include       /etc/nginx/mime.types;
    access_log  /var/log/nginx/access.log;
    keepalive_timeout 5;
    client_max_body_size    7m;
    server_tokens     off;
    server_name_in_redirect off;
    index index.html index.php;

    server {
        listen 443 ssl http2;
        ssl_certificate /etc/letsencrypt/live/photon.cloudremix.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/photon.cloudremix.net/privkey.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;


        # modern configuration. tweak to your needs.
        ssl_protocols TLSv1.2;
        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
        ssl_prefer_server_ciphers on;

        # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
        add_header Strict-Transport-Security max-age=15768000;

        ssl_dhparam /etc/nginx/dhparam.pem;

        # OCSP Stapling ---
        # fetch OCSP records from URL in ssl_certificate and cache them
        ssl_stapling on;
        ssl_stapling_verify on;

        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;

        server_name  photon.cloudremix.net;
        root        /var/www/photon.cloudremix.net/photon;
        charset     utf-8;
        access_log  /var/log/nginx/photon.cloudremix.net.log;
        location / {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        fastcgi_param SERVER_ADDR $server_addr;
        fastcgi_param PHP_VALUE "open_basedir=/var/www/photon.cloudremix.net/photon/:/tmp/:/dev/shm/:/usr/local/bin/jpegoptim:/usr/local/bin/optipng:/usr/local/bin/pngcrush:/usr/local/bin/pngquant:/usr/local/bin/cwebp";
        include fastcgi_params;
    }
    }
}

修正が終わったら再起動

systemctl restart nginx.service

アプリケーションのセットアップ

いよいよPhotonをインストールします。
画像変換用ツールをインストールしますが、cwebpだけは リポジトリにないので、ソースからインストールします。

dnf install -y jpegoptim optipng pngquant pngcrush

cd /usr/local/shar
wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.1.0-linux-x86-64.tar.gz
tar -xvf libwebp-1.1.0-linux-x86-64.tar.gz

先人の知恵によると/usr/local/binにシンボリックリンクがないと認識しないらしいので、リンクを作ってあげます。

ln -s /usr/local/share/libwebp-1.1.0-linux-x86-64/bin/cwebp cwebp
ln -s /usr/bin/jpegoptim jpegoptim
ln -s /usr/bin/optipng optipng
ln -s /usr/bin/pngquant pngquant

Photonのソースコードをチェックアウトします。

dnf install -y subversion

mkdir -p /var/www/photon.cloudremix.net
cd /var/www/photon.cloudremix.net

svn co http://code.svn.wordpress.org/photon/
chown -R nginx:nginx /var/www;

以上!

使ってみる!

Photonに管理画面だったり操作ツールだったりはないので、URLで操作します。

使い方
https://【用意したドメイン】/【画像のURL】?【セットするフィルタ】

動作例

元URLhttps://conoha.mikumo.com/wp-content/uploads/2020/11/1280x800-1.jpg

そのまま(実際はwebp最適化)

https://photon.cloudremix.net/conoha.mikumo.com/wp-content/uploads/2020/11/1280x800-1.jpg

alt

横幅を500pxに

https://photon.cloudremix.net/conoha.mikumo.com/wp-content/uploads/2020/11/1280x800-1.jpg?ssl=1&w=500

alt

ConoHaちゃんアップ(切り出し)

https://photon.cloudremix.net/conoha.mikumo.com/wp-content/uploads/2020/11/1280x800-1.jpg?ssl=1&crop=30,10,40,60

alt

あとがき

結構さらっと書いてますがむちゃくちゃトライアンドエラーでした。
config.phpを作成すれば色々と設定ができるので、気になったかたはお試しあれ。
あと本格的に使う場合は、ドメイン制限をしないと本家のように誰でも使える状態なるので必ず使うドメインだけに絞りましょう。