ConoHaで「Photon」を動かす

この記事は、[ConoHa Advent Calendar 2020 15日目](https://qiita.com/advent-calendar/2020/conoha)の記事です。
今回は清楚かわいい ConoHa ちゃんをボクだけのPhotonサーバにしていきます。

# Photonって何ぞ？？
WordPress公式が提供する画像変換サービスのことです。（ん？）
何ができるかというと

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

![alt](https://qiita-image.cloudremix.net/ConoHa-Photon-Original.jpg)


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

こんな感じでリサイズしたり
![alt](https://qiita-image.cloudremix.net/ConoHa-Photon-w_500.jpg)

切り抜いたり

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

![alt](https://qiita-image.cloudremix.net/ConoHa-Photon-crop_30_10_40_60.jpg)

してくれます。

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](https://code.trac.wordpress.org/browser/photon)

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

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

# サーバをつくる

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

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

（[去年は50GBだった](https://qiita.com/CloudRemix/items/691caf91efa3ef19a7ad)のに、今年は100GBに増えてる！！）


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

[SVNで公開されているソースコード](https://code.trac.wordpress.org/browser/photon)を見ながら必要そうなものを追加していきます。

の前にお約束

```
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
```

<details><summary>**こちらを丸っとコピペ（クリックで表示）**</summary><div>

```: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;
	}
    }
}
```

</div></details>

修正が終わったら再起動

```
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
```

[先人の知恵](https://ethitter.com/2017/04/running-a-private-photon-instance/)によると`/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】?【セットするフィルタ】
```

## 動作例

元URL`https://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](https://qiita-image.cloudremix.net/ConoHa-Photon-1280x800-1.jpg)

### 横幅を500pxに

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

![alt](https://qiita-image.cloudremix.net/ConoHa-Photon-w_500.jpg)

### ConoHaちゃんアップ（切り出し）

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

![alt](https://qiita-image.cloudremix.net/ConoHa-Photon-crop_30_10_40_60.jpg)


# あとがき

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