Serposcope を SSL のサブディレクトリで運用する

Serposcope CentOS 7
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

Google のランキングを解析できるツールで、無料の Serposcope を CentOS 7 に導入したので、その記録を残す。

構成

  • CentOS Linux release 7.9.2009 (Core)
  • OpenJDK version "1.8.0_282"
  • mysql Ver 15.1 Distrib 5.5.68-MariaDB
  • nginx version: nginx/1.18.0

Srposcope のインストール

基本的には 公式サイトの手順 に従って導入すれば大丈夫ですが、SSL に対応したいので Nginx を通してアクセスするようにします。

そのため、7134 ポートは外部からアクセスできるようにする必要はありません。

Java のインストール

既にインストールされていたので作業はしませんでしたが、入っていない場合は下記を実施。

yum install java-1.8.0-openjdk

Serposcope のダウンロード

今回は /usr/share/serposcope に設置するとします。

最新版のダウンロードページ から「jar」版をダウンロードして配置してください。(現在の最新バージョンは 2.12.0)

mkdir /usr/share/serposcope
cd /usr/share/serposcope
wget https://serposcope.serphacker.com/download/LATEST/serposcope-2.12.0.jar

MySQL の準備

初期状態の H2 embbeded database から MySQL へ変更するため、phpMyAdmin で予め ユーザー(serposcope)と空のデータベース(serposcope)を作成しておきます。

そして、Serposcope を設置したディレクトリに設定ファイル(/usr/share/serposcope/serposcope.conf)を配置し、以下のように記述します。

# path where is stored embedded database and data files
serposcope.datadir=/usr/share/serposcope

# log path
serposcope.logdir=/var/log/serposcope

# alternative database url, mysql example to use mysql : 
serposcope.db.url=jdbc:mysql://localhost/serposcope?user=serposcope&password=パスワード&allowMultiQueries=true

# additional database options
#serposcope.db.options=
#serposcope.db.debug=

# listen interface
#serposcope.listenAddress=

# listen port
#serposcope.listenPort=

Serposcope のサービス化

スタートアップ用スクリプトの作成

/usr/local/bin に serposcope-startup.sh を作成し、下記のように記述します。(設定ファイルを読み込んで起動するように設定)

#!/bin/bash
java -Dserposcope.conf=/usr/share/serposcope/serposcope.conf -jar /usr/share/serposcope/serposcope-2.12.0.jar

スタートアップスクリプトに実行権限を付与

chmod +x /usr/local/bin/serposcope-startup.sh

Unit 定義ファイルを配置

/etc/systemd/system/serposcope.service を作成し、下記を記述。

[Unit]
Description = Serposcope Service

[Service]
ExecStart = /usr/local/bin/serposcope-startup.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

サービスを自動起動する

systemctl enable serposcope
systemctl start serposcope

この段階でポートを空ければ、http://yourdomain:7134 で運用することができます。

※下記は Firewalld で public ゾーンに 7134 ポートを空ける場合の参考(今回は実施していません)

firewall-cmd --add-port=7134/tcp --zone=public --permanent
firewall-cmd --reload

Serposcope の SSL 化

Nginx のリバースプロキシを使って、SSL で運用するようにします。(Let's Encrypt などで SSL 証明書は取得済みのものとします。)

サブドメインを設定して、https://serposcope.example.com でアクセスする場合の Nginx の設定例

server {
    listen 80;
    server_name serposcope.example.com;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443 ssl http2;
    server_name serposcope.example.com;
    location / {
        root              /var/www/serposcope;
        proxy_pass        http://127.0.0.1:7134;
        proxy_set_header  X-Forwarded-Host $host;
    }
    # SSL
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;
    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_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security 'max-age=31536000';
}

サブディレクトリ運用の場合

他の管理ツールはサブドメインではなく、サブディレクトリで運用しているため、気分的に揃えたい。

(サブ)ドメイン直下に配置する場合は正常に表示されますが、サブディレクトリに配置すると表示が崩れます。

さらに、Login ボタンを押してもログインできません。

Seroscope の不完全表示

これは画像や CSS、JS ファイルがルートパスで読み込まれるように記述してあるため、サブディレクトリを無視してドメイン直下のパスから読もうとしているためです。

Login ボタンの action パスもルートパスで記述されているため、ログイン処理に移行されません。

そこで、Nginx の sub_filter を使って出力時のパスを書き換えることで対応しました。

    location ^~ /serposcope {
        rewrite ^/serposcope/(.*) /$1 break;
        proxy_pass http://127.0.0.1:7134;
        proxy_redirect      / /serposcope/;
        proxy_redirect      default;
        proxy_set_header    Accept-Encoding    "";
        # 出力内容書き換え
        sub_filter ' src="/' ' src="/serposcope/';
        sub_filter ' href="/' ' href="/serposcope/';
        sub_filter ' action="/' ' action="/serposcope/';
        sub_filter_once off;
    }
Serposcope ログイン画面

CSS なども反映され、ログインもできるようになったので、一見うまくいったように見えましたが、集計結果の画面が「error」となり表示されません。

推測になりますが、呼び出し元の combined.min.js が関数でリンクを生成している様で、sub_filter では書き換えられず、スマートな方法が思いつきませんでした。

エラーになっている部分はルートパスで「/google/○○○」を呼び出しているので、Nginx 側で /google/ のパスをリダイレクトすることで対処。

無理やり感はありますが、一応ちゃんと表示されるようになりました。

    # Serposcope
    location ^~ /serposcope {
        rewrite ^/serposcope/(.*) /$1 break;
        proxy_pass http://127.0.0.1:7134;
        proxy_redirect      / /serposcope/;
        proxy_redirect      default;
        proxy_set_header    Accept-Encoding     "";
        # 出力内容書き換え
        sub_filter 'src="/' 'src="/serposcope/';
        sub_filter 'href="/' 'href="/serposcope/';
        sub_filter 'action="/' 'action="/serposcope/';
        sub_filter_once off;
    }
    location ^~ /google {
        rewrite ^(.*)$ $scheme://$host:$server_port/serposcope$1 permanent;
    }

Serposcope のモジュール名(今回は Google モジュール)が集計結果のルートパス(/google)になると推測しているので、Yahoo や Bing モジュールを入れた場合は、同様にリダイレクトの設定を追加する必要がでてきます。

サブディレクトリの既存の設定とモジュール名が被った場合は、この方法は使えないとおもいます。

参考にしたサイト

CentOS 7.3:無料のSEO検索順位チェッカー「serposcope」インストール - よしまさのブログ
無料のSEO検索順位チェッカー「serposcope」を、CentOS7.3環境 … Continue reading →
nginx でコンテキストパス未対応サービスをリバースプロキシさせてみた(proxy_redirect + sub_filter) - Qiita
要約 proxy_redirect ディレクティブでレスポンス中の絶対パスは書き換えられない proxy_redirect の書き方はプロキシ転送先のサービス次第 sub_filter ディレクティブで絶対パスを書き換える sub_filt...

コメント

タイトルとURLをコピーしました