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 のインストール
既にインストールされていたので作業はしませんでしたが、入っていない場合は下記を実施。
1 | # yum install java-1.8.0-openjdk |
Serposcope のダウンロード
今回は /usr/share/serposcope に設置するとします。
最新版のダウンロードページ から「jar」版をダウンロードして配置してください。(現在の最新バージョンは 2.12.0)
1 2 3 | # 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)を配置し、以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 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 を作成し、下記のように記述します。(設定ファイルを読み込んで起動するように設定)
1 2 | #!/bin/bash java -Dserposcope.conf=/usr/share/serposcope/serposcope.conf -jar /usr/share/serposcope/serposcope-2.12.0.jar |
スタートアップスクリプトに実行権限を付与
1 | # chmod +x /usr/local/bin/serposcope-startup.sh |
Unit 定義ファイルを配置
/etc/systemd/system/serposcope.service を作成し、下記を記述。
1 2 3 4 5 6 7 8 9 10 | [Unit] Description = Serposcope Service [Service] ExecStart = /usr/local/bin/serposcope-startup.sh Restart = always Type = simple [Install] WantedBy = multi-user.target |
サービスを自動起動する
1 2 3 4 5 6 7 8 9 10 11 | # サービス自動起動 ON # systemctl enable serposcope # サービス自動起動 OFF # systemctl disable serposcope # 起動 # systemctl start serposcope # 停止 # systemctl stop serposcope |
この段階でポートを空ければ、http://yourdomain:7134 で運用することができます。
※下記は Firewalld で public ゾーンに 7134 ポートを空ける場合の参考(今回は実施していません)
1 2 | # firewall-cmd --add-port=7134/tcp --zone=public --permanent # firewall-cmd --reload |
Serposcope の SSL 化
Nginx のリバースプロキシを使って、SSL で運用するようにします。(Let's Encrypt などで SSL 証明書は取得済みのものとします。)
サブドメインを設定して、https://serposcope.●●●.com でアクセスする場合の Nginx の設定例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | server { listen 80; server_name serposcope.●●●.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name serposcope.●●●.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/●●●.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/●●●.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 ボタンを押してもログインできません。
これは画像や CSS、JS ファイルがルートパスで読み込まれるように記述してあるため、サブディレクトリを無視してドメイン直下のパスから読もうとしているためです。
Login ボタンの action パスもルートパスで記述されているため、ログイン処理に移行されません。
そこで、Nginx の sub_filter を使って出力時のパスを書き換えることで対応しました。
1 2 3 4 5 6 7 8 9 10 11 12 | 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; } |
CSS なども反映され、ログインもできるようになったので、一見うまくいったように見えましたが、集計結果の画面が「error」となり表示されません。
推測になりますが、呼び出し元の combined.min.js が関数でリンクを生成している様で、sub_filter では書き換えられず、スマートな方法が思いつきませんでした。
エラーになっている部分はルートパスで「/google/○○○」を呼び出しているので、Nginx 側で /google/ のパスをリダイレクトすることで対処。
無理やり感はありますが、一応ちゃんと表示されるようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 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 モジュールを入れた場合は、同様にリダイレクトの設定を追加する必要がでてきます。
サブディレクトリの既存の設定とモジュール名が被った場合は、この方法は使えないとおもいます。
コメント