「Apache」カテゴリーアーカイブ

ベクトルタイルの作り方~メモ~

今更ですが、ベクトルタイルの作成方法について整理しておきます。
以前とやり方が違っているので、自分用メモです。

環境

OS:Rocky Linux 9
準備として必要なパッケージをインストールします。

適当な作業用ディレクトリを作成しそこへ移動します。
その後、以下のコマンドを実行して、必要なパッケージ類をインストールします。
足りないものは適宜追加してください。

yum -y install gcc-c++ sqlite-devel zlib-devel git

ここからは、githubにインストール手順が記載されていますので、合わせて確認してください。
https://github.com/mapbox/tippecanoe#installation

次に、mvtを作成するためのプログラムソースであるtippecanoe(「ティペカヌー」と読むらしい)をgithubからダウンロードします。

git clone https://github.com/mapbox/tippecanoe.git

gitコマンドで展開された作成されたtippecanoeディレクトリへ移動して、コンパイルとインストールを行います。
公式では、下記のmakeを行う際、「-j」オプションを指定してmakeの並列実行を指定していますが、私の試した環境では敢えて「-j」無しでmakeを行いました。理由については後述します。

cd tippecanoe
make
make install

makeの際にオプションで-jを指定するとコンパイルが速くなりますが、プアなマシンでやると固まってしまう場合があります。
また、オブジェクト作成時の依存関係が原因と思われるエラーが発生し、これもまた正常にコンパイル/リンクが出来ない場合があります。

今回、私の環境では、マシンが固まる現象が発生したため「-j」を外してmakeを実行しました。
時間は掛かりますが、正規の方法ですので問題はありません。

mvtを作成するにはそこそこのリソースを必要とするケースが多いと思われ、出来ればCPUやメモリなどのリソースに余裕がある環境で「-j」を付けてコンパイルをすることが望ましいです。

これで必要なパッケージとかはインストールされているのですが、パスを切っておかないとだめです。

Rocky 9 のデフォルト環境設定なのか、/usr/local/binへのパスが設定されていませんでした。必要な方は設定しておいてください。
ちなみに、デフォルト設定を変更したい人はこちらを参考にしてください。

mbtilesとpbfの作り方

mbtilesの作り方

tippecanoe -l gs_map -rg -z18 -Z6 -o hoge.mbtiles hoge.geojson

-rg デフォルトでも構いませんが、データによって値を設定すると良さそうです。

pbfの作り方

コマンドは以下の通りです。

tippecanoe -l gs_map -rg -z18 -Z6 -e タイル出力先ディレクトリ hoge.geojson

実際に、この方法で作成することは出来ますが、Mapbox GL JSではこの方法で作成したpbfは扱えないという記載が見受けられました。
tippecanoeは、pbfを作成する際にデフォルトで圧縮を行っている(後で重要になる)そうです。
そこで、圧縮を行わない設定を追加します。

tippecanoe -l gs_map -rg -z12 -Z6 --no-tile-compression --drop-densest-as-needed --no-tile-size-limit -j '{"*":["all",[">=","対象属性",1000]]}' -e output_dir input.geojson

① –no-tile-compression : 圧縮を行わない。
② –no-tile-compression :タイルが大きすぎる場合は、フィーチャ間の最小間隔を広げて 500K 未満に縮小しようとします。 検出された間隔は、ズーム レベル全体に適用されます。
③ –no-tile-size-limit : 作成するタイルサイズの制限を解除します。
④ -j ‘{“*”:[“all”,[“<“,”対象属性”,1000]]}’ :フィルタリング条件
⑤ -e output_dir :出力先ディレクトリ

なんか②と③が打ち消しあっている様な感じにも思えなくもないのですが、③は確実に機能している様でした。

④で対象となるフィーチャーをフィルタリングしています。
これを行わないと、ランダムにフィーチャーがドロップ(間引き)されます。

属性による対象地物の指定方法

-jオプションについて、もう少し説明します。
こんな感じで指定しています。

-j '{"*":["all",[">=","対象属性",1000]]}'

「*」 :対象のファイルを指定している。ここでは全てを意味します。
    対象ファイルを分けて条件を変更することも可能なのでしょう。
「all」:フィルター演算子。allは全ての条件を満たすことを意味する。
    他に、「in」「none」などがある。
「>=」:演算子の指定。
「比較対象」:フィーチャーの属性を指定。
「比較条件」が1000以上のデータを対象とする。

オプションの設定はたくさんあって理解するのが大変です。
気が向いたら、追記してみようと思います。

参考:https://github.com/mapbox/tippecanoe#cookbook

Web配信におけるデータ圧縮

先程の方法で作成したpbfファイルは、オプションを指定することで非圧縮ファイルになっています。
mapbox GL JSで扱う場合には、非圧縮が条件になるため仕方ありません。

でも、それは mapbox GL JSが扱う際に圧縮されていると不味いということで、通信中に圧縮されていることは特に関係ありません。

ということで、配信するサーバでApacheを利用している場合は、以下の方法を検討してみると良いでしょう。

Apacheの配信データを圧縮する。

/etc/httpd/conf.dに以下のファイルを作成する。

vi /etc/httpd/conf.d/mod_deflate.conf

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/font-woff
    AddOutputFilterByType DEFLATE application/x-font-otf
    AddOutputFilterByType DEFLATE application/x-font-ttf
    AddOutputFilterByType DEFLATE text/pbf
</IfModule>

他にも必要に応じて設定を行う。
httpdの再起動もしくはリロードを行えばOK

systemctl restart httpd
もしくは
systemctl reload httpd

Rocky Linux 8.6 へ Redmine 5.0をインストールする。

はじめに

Rocky Linux 8.6(8.5で良いのですが。。。)へRedmine 5.0をインストールしている情報が見当たらなかったので、トライしてみることにしました。
入手のし易さからすると、Redmine 4.xをインストールする感じだったのですが、Rubyの2.7は通常メンテナンスフェーズを終了している様なので、Ruby 3.0以降を導入するのがベターと考えました。
更には、Ruby 3.0以降をサポートしているのは、Redmine 5.0以降という情報もあり、やっぱりこの選択肢を選ぶことになるな・・・という感じです。

まあ、色々と問題は出てくると思いますが、取り敢えず進めて行こうと思います。

彼是5年程前にRedmineをインストールした記録があります。
https://tech.godpress.net/?p=610
インターネット上で確認出来る資料と、過去を思い起こしながらインストールを進めたいと思います。

環境確認

今回インストールを行うサーバは、既に別の作業を進めていたこともあり、以下の構成が既に構成されています。

OS:Rocky Linux 8.6
DB:Mariadb 10.3

epel-releaseリポジトリはインストール済みでした。

一応、コマンドで確認しておきます。
# mysql –version
mysql Ver 15.1 Distrib 10.3.32-MariaDB, for Linux (x86_64) using readline 5.1

他に必要そうなものは入っていなかったみたいです。

インストール

基本的なパッケージのインストール

データベースのインストール方法については割愛します。

それでは必要なパッケージ類を問答無用でインストールしてしまいます。

# dnf install epel-release
# dnf groupinstall "Development Tools"
# dnf install openssl-devel readline-devel zlib-devel curl-devel
# dnf install --enablerepo=powertools libyaml-devel
# dnf install httpd httpd-devel
# dnf install --enablerepo=powertools ImageMagick ImageMagick-devel

ここまでは順調でしたが。。。。フォントのインストールが上手く行きません!?

# dnf install --enablerepo=powertools ipa-pgothic-fonts

色々探してみて、こんな感じでインストールします。

# rpm -Uvh https://pkgs.dyn.su/el8/base/x86_64/ipa-pgothic-fonts-003.03-14.el8.noarch.rpm

Rubyインストール(自己責任で!)
#あまりここの部分は信用しないように(^^;

さて、ここからは私の勘です!間違っていたらご容赦ください。
ちなみに、私はVM上に環境構築を行っています。
自信もないので、知れっとスナップショットを作成して、Rubyインストール前の環境を保存しておきます。

何故この様なことをするかと言いますと、他のサイトで記載されている方法はrpmを直接インストールする方法が取られています。
私は、パッケージのバージョン管理を極力省くためにdnfでのインストールを行う様にしています。(好みの問題ですね)
rpmでインストールした場合でもdnfでインストールの確認などを行えることは重々承知しているのですが、リポジトリとして管理されているかというと、そうではないでしょう(想像)。
ということは、更新があったことを知る術が無い。
後々の構成管理に矛盾が生じてしまうのではないか?

ということで、出来るだけdnfでインストールを行いたいと思っています。

今回、Rubyのサポート状況などを気にしていることもあり、出来れば3.0以降を導入したい訳ですが、果たして3.0以降を素直にインストールさせてくれるでしょうか?

# dnf list | grep -i ruby
kf5-kross-ruby.x86_64                                             21.08.3-1.el8                                             epel
libselinux-ruby.x86_64                                            2.9-5.el8                                                 appstream
mlt-ruby.x86_64                                                   6.24.0-4.el8                                              epel
munin-plugins-ruby.noarch                                         2.0.66-1.el8                                              epel
remctl-ruby.x86_64                                                3.17-4.el8                                                epel
ruby.i686                                                         2.5.9-109.module+el8.5.0+740+b85cbe0d                     appstream

結論としてRubyのバージョンは2.5.9と無残にもダメでした。
何かリポジトリを追加して・・・とか探していたのですが、これです!

# dnf module list ruby
メタデータの期限切れの最終確認: 1:57:02 時間前の 2022年06月04日 16時07分16秒 に実施しました。
Rocky Linux 8 - AppStream
Name                            Stream                             Profiles                              Summary
ruby                            2.5 [d]                            common [d]                            An interpreter of object-oriented scripting language
ruby                            2.6                                common [d]                            An interpreter of object-oriented scripting language
ruby                            2.7                                common [d]                            An interpreter of object-oriented scripting language
ruby                            3.0                                common [d]                            An interpreter of object-oriented scripting language

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled

インストール対象のモジュール一覧を確認出来ます。
2.5がデフォルトになっている様ですが、3.0の存在も確認出来ました!

では!

# dnf module enable ruby:3.0
メタデータの期限切れの最終確認: 2:01:26 時間前の 2022年06月04日 16時07分16秒 に実施しました。
依存関係が解決しました。
=======================================================================================================================================================================================
 パッケージ                                  アーキテクチャー                           バージョン                                   リポジトリー                                サイズ
=======================================================================================================================================================================================
モジュールストリームの有効化中:
 ruby                                                                                   3.0

トランザクションの概要
=======================================================================================================================================================================================

これでよろしいですか? [y/N]: y
完了しました!

再度確認してみると。。。

# dnf module list ruby
メタデータの期限切れの最終確認: 2:01:37 時間前の 2022年06月04日 16時07分16秒 に実施しました。
Rocky Linux 8 - AppStream
Name                            Stream                             Profiles                              Summary
ruby                            2.5 [d]                            common [d]                            An interpreter of object-oriented scripting language
ruby                            2.6                                common [d]                            An interpreter of object-oriented scripting language
ruby                            2.7                                common [d]                            An interpreter of object-oriented scripting language
ruby                            3.0 [e]                            common [d]                            An interpreter of object-oriented scripting language

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled

ということで、3.0がenableになりましたね。
これで通常と同じようにインストールを行うと3.0をインストールすることが出来ます。

# dnf install ruby
メタデータの期限切れの最終確認: 2:01:50 時間前の 2022年06月04日 16時07分16秒 に実施しました。
依存関係が解決しました。
=======================================================================================================================================================================================
 パッケージ                                  アーキテクチャー                バージョン                                                       リポジトリー                       サイズ
=======================================================================================================================================================================================
インストール:
 ruby                                        x86_64                          3.0.2-140.module+el8.5.0+668+665814fa                            appstream                           88 k
依存関係のインストール:
 ruby-libs                                   x86_64                          3.0.2-140.module+el8.5.0+668+665814fa                            appstream                          3.2 M
 rubygem-json                                x86_64                          2.5.1-140.module+el8.5.0+668+665814fa                            appstream                           99 k
 rubygem-psych                               x86_64                          3.3.0-140.module+el8.5.0+668+665814fa                            appstream                           98 k
弱い依存関係のインストール:
 ruby-default-gems                           noarch                          3.0.2-140.module+el8.5.0+668+665814fa                            appstream                           79 k
 rubygem-bigdecimal                          x86_64                          3.0.0-140.module+el8.5.0+668+665814fa                            appstream                          101 k
 rubygem-bundler                             noarch                          2.2.22-140.module+el8.5.0+668+665814fa                           appstream                          443 k
 rubygem-io-console                          x86_64                          0.5.7-140.module+el8.5.0+668+665814fa                            appstream                           72 k
 rubygem-rdoc                                noarch                          6.3.1-140.module+el8.5.0+668+665814fa                            appstream                          458 k
 rubygems                                    noarch                          3.2.22-140.module+el8.5.0+668+665814fa                           appstream                          318 k

トランザクションの概要
=======================================================================================================================================================================================
インストール  10 パッケージ

ダウンロードサイズの合計: 5.0 M
インストール後のサイズ: 16 M
これでよろしいですか? [y/N]: y

いや~知らんかった(^^ゞ
まだまだ修行が足りませんねw

実はここで悩みました。
他のサイトでインストールしている手順と異なるので、どこまで進んだのか解らなくなってしまいました(^^ゞ
取り敢えず、Rubyがインストールされたことを確認します。

# ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]

おぉ~Ruby 3.0.2がインストールされています!
多分、この辺りから再開かな?ということで、bundlerをインストールしてみます。

# gem install bundler
Fetching bundler-2.3.15.gem
Successfully installed bundler-2.3.15
Parsing documentation for bundler-2.3.15
Installing ri documentation for bundler-2.3.15
Done installing documentation for bundler after 0 seconds
1 gem installed

なんだろう。。。もやもやする。。。

でも、取り敢えず進めます。

データベースの設定

データベース(Mariadb)にRedmine用のユーザとデータベースを作成します。

# mysql -u root -p
MariaDB [(none)]> CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'XXXX';
MariaDB [(none)]> GRANT ALL ON *.* TO 'redmine'@'localhost' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> CREATE DATABASE redmine CHARACTER SET utf8mb4;
MariaDB [(none)]> exit
Bye

リアルタイムOS上でmsやμs単位でプログラムを組んできた人間にとって、データベースなんてプログラムの足を引っ張る近寄るべからずな存在であり、使えたら良いのにな~という夢の存在でもありましたが、やはり苦手ですw

Redmine本体のインストール

ここまでは全て準備作業でした。
やっとここからRedmineの本体をインストールします。
なんかお手軽インストールの方法もあるようなのですが、最新版ではまだサポートされている気配が無かったので、地道にインストール作業を続けています。
大抵、こういう時は何かの罠に嵌るんですよねぇ~
Linuxのインストールでは毎度のことですが、予定が狂う(TT)

泣き言はやってから!ということで進めます。
以前はSVNを使ってインストールを行いましたが、それも良いのですが、良かったのかどうなのか?というところもありますので、今回はダウンロードで素直に挑んでみたいと思います。

適当なディレクトリへ移動して、パッケージをダウンロードします。
本家からダウロードします。
こちらで対象を確認します。

# cd /home/pkg/redmine
# curl -O https://www.redmine.org/releases/redmine-5.0.1.tar.gz
# tar zxvf redmine-5.0.1.tar.gz
# cd /var/lib
# ln -s /home/pkg/redmine/redmine-5.0.1 redmine
# cd redmine
# bundle install --without development test

ここでエラーが発生しました。
どうも幾つかのパッケージがインストールされていなかったようです。

# dnf install ruby-devel
# dnf list | grep mariadb-devel

多分、これで実行できるはずですが、もしそれでも上手く行かない場合は以下も試してみてください。(多分、関係ないと思いますが・・・)

# dnf install rubygem-mysql2.x86_64

再度実行します。

# bundle install --without development test
<省略>
undle complete! 42 Gemfile dependencies, 73 gems now installed.
Gems in the groups 'development' and 'test' were not installed.
Bundled gems are installed into `./vendor/bundle`
#

こんな感じで上手くインストール出来た様です。

セッションストア秘密鍵の生成を行います。

# bundle exec rake generate_secret_token

データベースへ接続するための設定を行います。

config/database.example.ymlをコピーしてconfig/database.ymlを作成します。
以下の示す様に、必要な項目を変更します。

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "my_password"

以下のコマンドを実行すると、データベース上にテーブルを作成してくれます。

RAILS_ENV=production bundle exec rake db:migrate

更に以下のコマンドを実行してデフォルトデータをデータベースへ登録します。

# RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data


Default configuration data loaded.

次に、passengerをインストールします。

# gem install passenger
# passenger-install-apache2-module –auto –languages ruby

しばらく時間が掛かります。
10分以上掛かったと思います。
次に、このコマンドで設定内容を確認します。

passenger-install-apache2-module –snippet

ここで表示される内容を記録しておきます。
その上で、Apacheの設定を追加します。

# vi /etc/httpd.conf/conf.d/redmine.conf
<Directory "/var/lib/redmine/public">
 Require all granted 
</Directory> 
# Passengerの基本設定。 
# passenger-install-apache2-module --snippet で表示された設定を記述。 
# 環境によって設定値が異なるため以下の3行はそのまま転記せず、必ず 
# passenger-install-apache2-module --snippet で表示されたものを使用すること。 
# 

LoadModule passenger_module /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.1.2/ buildout/apache2/mod_passenger.so 
<IfModule mod_passenger.c>
 PassengerRoot /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.1.2
 PassengerDefaultRuby /usr/local/bin/ruby 
</IfModule> 
# Passengerが追加するHTTPヘッダを削除するための設定(任意)。 
# Header always unset "X-Powered-By" Header always unset "X-Runtime" 
# 必要に応じてPassengerのチューニングのための設定を追加(任意)。 
# 詳しくはPhusion Passenger users guide(https://www.phusionpassenger.com/library /config/apache/reference/)参照。 
PassengerMaxPoolSize 20 
PassengerMaxInstancesPerApp 4 
PassengerPoolIdleTime 864000 
PassengerHighPerformance on 
PassengerStatThrottleRate 10 
PassengerSpawnMethod smart 
PassengerFriendlyErrorPages off
# Passengerのログを別で出力する時はこんな感じです。記載しなくてもOKです。
# PassengerLogFile /var/log/httpd/passenger_error.log

RackBaseURI /redmine      <== これは後で追加の理由が解ります。

概ねこんな感じでOKですが、サイトによって記載が異なるので参考までに留めてください。

ディレクトリの権限を変更します。

chown -R apache:apache /var/lib/redmine

ここで、Aapcheを再起動?起動させればOKです。
念のために、フルセットで行っておきますね。

# systemctl stop httpd
# systemctl start httpd
# systemctl enable httpd

これだけやっておけばApacheの起動についてはOKでしょう!

ここで、このシステムをRedmineだけに使おうと思っていないので、少し変更してしまいます。

# cd /var/www/html
# ln -s /var/lib/redmine/public redmine

上記で既に記載していますが、/etc/httpd/conf.d/redmine.confに以下の設定を追加します。これでアクセス可能となります。

RackBaseURI /redmine
http://MyDomain/redmineへアクセスするとRedmineの画面が表示されるはず。。。だったのですが(^^ゞ
エラーが出たり色々ダメですw

他の環境ではここまでで行けるはずなのですが、私の環境では上手く行きませんでした。
こんな感じでエラーが出力されていました。

# tail -f passenger_error.log
[ N 2022-06-05 23:14:33.6804 10996/T8 Ser/Server.h:558 ]: [ServerThr.1] Shutdown finished
[ N 2022-06-05 23:14:33.6805 10996/Td Ser/Server.h:902 ]: [ApiServer] Freed 0 spare client objects
[ N 2022-06-05 23:14:33.6805 10996/Td Ser/Server.h:558 ]: [ApiServer] Shutdown finished
[ N 2022-06-05 23:14:33.7380 11018/T1 age/Wat/WatchdogMain.cpp:1373 ]: Starting Passenger watchdog...
[ N 2022-06-05 23:14:33.7587 11021/T1 age/Cor/CoreMain.cpp:1340 ]: Starting Passenger core...
[ N 2022-06-05 23:14:33.7588 11021/T1 age/Cor/CoreMain.cpp:256 ]: Passenger core running in multi-application mode.
[ N 2022-06-05 23:14:33.7662 11021/T1 age/Cor/CoreMain.cpp:1015 ]: Passenger core online, PID 11021
[ N 2022-06-05 23:14:34.7755 10996/T1 age/Cor/TelemetryCollector.h:531 ]: Message from Phusion: End time can not be before or equal to begin time
[ N 2022-06-05 23:14:34.8075 10996/T1 age/Cor/CoreMain.cpp:1325 ]: Passenger core shutdown finished
[ N 2022-06-05 23:14:36.8751 11021/T5 age/Cor/SecurityUpdateChecker.h:519 ]: Security update check: no update found (next check in 24 hours)

回避方法を記載しておきます。

# gem update strscan

どうもstrscanが古い様です。
新規にインストールしているところなのに不自然ではありますが、アップデートすることで問題の解決に至りました。不思議です。

再度アクセスすると画面が表示出来る様になりました。

このアップデートをする前は以下のコマンドを実行してブラウザでアクセスすると動作を確認出来ました。

bundle exec rails server -e production

こちらも、他のサイトでは以下の様になっていましたが、上記で動作を確認することが出来ました。

bundle exec rails server webrick -e production

自動でwebrickを認識する様で、必要ないみたいです。

サイトにアクセスしてからのID/パスワードはデフォルトで以下になります。

ID:admin
パスワード:admin

結構嵌りました。
もうしばらくすれば、安定したインストールを方法を記載したサイトが出てくると思います。
こちらのサイトは参考までに留めるのが良いかも知れませんね。

Apache(Webサーバ)のチューニングとベンチマーク

ここでは、Apache HTTP Serverのチューニングとベンチマークに関してまとめます。

Apacheのベンチマーク

Apacheの性能はサーバの性能にも左右されますが、Apacheの設定内容によっても変わってきます。
最近のサーバはそこそこ速くなっているので、デフォルト設定のままでもそこそこ速く動いてくれるのですが、それでもアクセス集中対策を考慮するにはサーバのApacheのチューニングも必要になります。

さて、チューニングの方法は説明する前に、性能測定の方法について説明します。

Apacheの性能測定には、ab(Apache Bench)コマンドを使用します。

色々なサイトでも紹介されていますが、基本的なコマンド操作は以下の様になります。

# ab -n 100 -c 20 http://hogehoge.net/

-n 数値  : リクエストの総数
-c 数値  : 同時接続数

指定したURLに対し「リクエストの総数」分のリクエストを行います。並列して接続するため、「同時接続数」を指定することが出来ます。

試しにabコマンドを叩いてみます。(URLは適当です。)
※絶対に他人のサイトを指定しないでください。DoS攻撃とみなされる可能性があります。負荷試験の一種なので、対象のサーバに高負荷を与えることになります。

# ab -n 600 -c 200 http://hogehoge.net/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking hogehoge.net (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Finished 600 requests


Server Software:        Apache/2.2.15
Server Hostname:        hogehoge.net
Server Port:            80

Document Path:          /
Document Length:        307 bytes

Concurrency Level:      200
Time taken for tests:   4.465 seconds
Complete requests:      600
Failed requests:        0
Write errors:           0
Non-2xx responses:      600
Total transferred:      305400 bytes
HTML transferred:       184200 bytes
Requests per second:    134.39 [#/sec] (mean)
Time per request:       1488.242 [ms] (mean)
Time per request:       7.441 [ms] (mean, across all concurrent requests)
Transfer rate:          66.80 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1   11  13.9      1      35
Processing:    58  916 895.7    692    4364
Waiting:       58  916 895.7    692    4364
Total:         75  927 900.7    695    4396

Percentage of the requests served within a certain time (ms)
  50%    695
  66%    752
  75%    777
  80%    819
  90%   1609
  95%   4161
  98%   4193
  99%   4357
 100%   4396 (longest request)

ここで注目したいのは、以下の2点です。
Failed requests: 0
Requests per second: 134.39 [#/sec] (mean)

「Failed requests」でリクエストがフェールになった回数をカウントしています。Failが発生しない様に調整する必要があります。

では、調整の仕方を見ていきましょう。

Apacheのチューニング

Apache 2.2系と2.4系ではチューニングの設定が少し異なります。パラメタの名称が一部変更になっているためです。
以下にそれぞれのパラメタ設定例を示します。
ただし、この設定内容は環境により異なりますので、ご自身のサーバ環境によって値を調整してみてください。

Apache2.2系のチューニングパラメタ

Apache 2.2系のチューニング方法を以下に紹介します。今更感はあるのですが、最も効果的な結果が得られたのがこの環境だったので敢えて事例紹介します。

対象ファイル:/etc/httpd/conf.d/httpd.conf

viなどで開いて編集してください。

こちらがデフォルト状態の設定状態です。

##
## Server-Pool Size Regulation (MPM specific)
##

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers    5
ServerLimit       10
MaxClients        10
MaxRequestsPerChild  4000
</IfModule>

こちらが設定変更後の値です。

##
## Server-Pool Size Regulation (MPM specific)
##

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       10
MinSpareServers    20
MaxSpareServers    50
ServerLimit       50
MaxClients        50
MaxRequestsPerChild  1000
</IfModule>
StartServers1起動時に生成される子サーバの数
MinSpareServers1アイドル状態で待機している
子サーバの最小数
MaxSpareServers5アイドル状態で待機している
子サーバの最大数
ServerLimit10MaxClientsに指定できる上限値
MaxClients10同時接続可能なクライアントの数
MaxRequestsPerChild4000子サーバが処理できる
リクエストの総数

デフォルトの状態では、StartServersが「1」になっていたので、最初の接続に掛かる時間が遅くなる傾向にありそうです。
また、MaxClientsが「10」しかないため同時に処理できるリクエストの数が少なく、こちらも処理が遅くなる傾向にあったようです。
変更後の値に設定し、以下のコマンドでWebサーバを再起動します。


【CentOS 6の場合】
# service httpd graceful
もしくは
# service httpd restart

【CentOS 7の場合】
# systemctl restart httpd

Webサーバの再起動が完了したら、コマンドを実行して動作を確認してみましょう。

# ab -n 600  -c 200 http://hogehoge.net/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking tech.godpress.net (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Finished 600 requests


Server Software:        Apache/2.2.15
Server Hostname:       hogehoge.net
Server Port:            80

Document Path:          /
Document Length:        317 bytes

Concurrency Level:      200
Time taken for tests:   0.998 seconds
Complete requests:      600
Failed requests:        0
Write errors:           0
Non-2xx responses:      614
Total transferred:      333402 bytes
HTML transferred:       194638 bytes
Requests per second:    601.08 [#/sec] (mean)
Time per request:       332.736 [ms] (mean)
Time per request:       1.664 [ms] (mean, across all concurrent requests)
Transfer rate:          326.17 [Kbytes/sec] received

主要な内容については以下の通りです。

Failed requests: 0
Requests per second: 601.08 [#/sec]

「Requests per second」の値が134.39→601.08に変化しており、1秒間に処理で来ているリクエストの数が大幅にアップ(約4.5倍)しました。

と、ここで問題です。
MaxClientsを適当にしていしましたが、子サーバ(プロセス)が使用するメモリを考慮して計算しないと、実装メモリよりも多くの子サーバが起動してしまうことになってしまいます。
そうなると、スワップ領域まで達し、最終的にもメモリ不足に陥ることになります。
まず、httpdプロセスがどれ位のメモリを使用しているか?そして、PHPを使用しているならば、PHPの利用するメモリも考慮する必要があります。
実際にサーバ上で動作する際に必要となるメモリ量も気に掛かります。

面倒ですよね。
色々な方が作られている様ですが、MaxClientsを自動計算してくれる仕組みがあります。
その方法について、次に説明を行います。

MaxClientsの自動計算

MaxClientsを自動計算する方法について記載します。
Apache Web Service(Webサーバ)は、並列処理を実現するために複数子サーバを起動して、同時に複数のクライアントから要求されるリクエストに対応します。
その最大値をMaxClientsで指定します。

理論的には、httpd(子サーバ)が利用するメモリとPHPが利用するメモリで1つのクライアントから要求される処理を行うとして、システムのメモリを割ることで値が得られる感じです。
この時、システムでそれ以外に使用するメモリも考慮する必要があり、意外と面倒な計算と情報収集を行うこととなります。

それを自動化してくれる仕組みが以下のサイトにあるスクリプトになります。

https://github.com/richardforth/apache2buddy

apache2buddyを利用してMaxClientsを計算させるには、以下のコマンドを実行し、表示される情報を利用します。

コマンドは以下に記していますが、上記のURLで示されたサイトに記載がありますので(英文ですが)、そちらを参考にされることをお勧めします。(本記事が古くなると使えなくなりますが、上記サイトはメンテナンスされていますので)

# curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | perl
<<あまり見られたくない情報があるので、割愛します。>>
pache2buddy.pl report for server:  (xx.xx.xx.xx):

Settings considered for this report:
[ !! ] *** LOW UPTIME ***.
[ @@ ] The following recommendations may be misleading - apache has been restarted within the last 24 hours.

        Your server's physical RAM:            1024 MB
        Remaining Memory after other services considered: 1016 MB
        Apache's MaxClients directive:  15  <--------- Current Setting
        Apache MPM Model:        prefork
        Largest Apache process (by memory):27 MB
[ !! ]  Your MaxClients setting is too low.
        Your recommended MaxClients setting (based on available memory) is between 33 and 37. <------- Acceptable Range (10% of MAX)
        Max potential memory usage:407 MB
        Percentage of TOTAL RAM allocated to Apache:39.82  %
        Percentage of REMAINING RAM allocated to Apache:40.12  %
--------------------------------------------------------------------------------
A log file entry has been made in: /var/log/apache2buddy.log for future reference.

重要な箇所は以下の一文です。

Your recommended MaxClients setting (based on available memory) is between 33 and 37. <——- Acceptable Range (10% of MAX)

httpdを再起動した直後などは正確な数値が得られない場合がありますので、本来は24時間程度運用した状態で数値を計算することが望ましいです。

上記の例では、MaxClientsの値として33~37が望ましい値として提示されています。

正直、実験を行ったサーバでは、長時間のヒートランを行っていなかったのでこの値が示されましたが、本来であればもっと少ない値が得られるのではないかと思います。

これを元に、先程示したhttpd.confに記載されている以下の値を調整します。

StartServers
MinSpareServers
MaxSpareServers
ServerLimit
MaxClients
MaxRequestsPerChild

最後に、Webサーバの再起動を行えば設定が反映され安定した動作になると思います。こまめにチェックするというよりも、ある程度時間を空けてチェックすると良いと思います。

apache2buddy以外にも自動計算や手動計算の手法が幾つか紹介されています。
自分に合った方法を見つけることが重要です。
今回の手法は、Linux上での手法となります。Windows上での計算は難しいかな?

concrete5 インストール

背景

concrete5をインストールしたのは覚えていたのですが、インストール方法が解らなくなったので、改めてインストールし直すという恥ずかしぃ〜思いをしながら、まとめ直すとにしました。

対象環境

ここではCentOS 7上に環境を構築します。
多少のパッケージインストール方法は省かせていただきますが、一般的な作業だけ省いているので、概ね問題ないでしょう(^^)

対象OS:CentOS 7.5.1804 (多分、7.xなら同じかと思います。)
他のパッケージ類は適宜インストールしますので、ここでの情報は以上となります。
ちなみにご自身の環境がどうなっているのか分からなければ以下を確認下さい。

# more /etc/centos-release
CentOS Linux release 7.5.1804 (Core)

ちなみに、作業は全てrootユーザで行います。
一般ユーザでもsudoなんかを使いながら作業を行なえば実現可能ですが、面倒なんで(^^;

準備作業

いつものことながら、インストールする前の準備運動ならぬ下地造りから入ります。

毎度お馴染みのepel-releaseリポジトリの設定ですね。

# yum install epel-release

yum updateコマンドで全体をアップデートして置いた方がよいのですが、私の環境はNVIDIAのドライバをインストールしていたりいろいろと下手なパッケージを更新するとハレーションが発生する可能性があるので、敢えて行いませんが。。。やった方が良いです。

下地造りの前準備?が出来たところで実際に必要なパッケージをインストールします。

yum install httpd mariadb mariadb-server php php-gd php-mbstring php-mcrypt php-mysql php-xml gd

と、いきなり間違えました(^^;
単純にインストールすると、PHPのバージョンが古かったはずなので、上記の方法は辞めて以下の方法でインストールを行います。

まずremiで提供されているリポジトリを使えるようにします。

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

mariadbのインストール

# yum install mariadb mariadb-server

Apache Web Server (httpd)のインストール

# yum install httpd

PHP5.6のインストール

concrete5 バージョン8以降ではPHPのバージョン 7.2以降を推奨しておりますが、私の環境は既に5.6の環境である程度構築されていたので、PHP5.6をベースにします。

# yum install --enablerepo=remi,remi-php56 php php-gd php-mbstring php-mcrypt php-mysql php-xml

PHPの古いバージョンが入っていた場合には適宜削除してインストール仕直す必要が生じます。(頑張ればなんとかなるなんて思わない方が良いですよw)

unzipのインストール

きっと入ってますよね。でも一応ね。

# yum install unzip

以上で準備作業は完了です。

concrete5本体のインストール

いつも思うんですけど、本来インストールしようとしているパッケージのインストール作業って、それ程大変じゃないんですよね。どちらかというと下地の準備の方が面倒なんですよね。
そこまできちんとして書いてくれれば嬉しいのですが。。。
そういった意味では、リポジトリって良くできてますよね。
と言っても、勝手にPHPのバージョンが上げられちゃったりすると困るので、結局こうなるのですが。。。

さて、前置きが長くなりましたが、本体のインストールです。

concrete5はWeb上で動作します。また、データベースを利用します。
ということで、httpdとMariaDBをセットアップしておく必要があるわけです。

httpdサービスを起動する。

Webサービスを利用できるように準備します。
毎度のことではありますが。。。

# systemctl start httpd
# systemctl enable httpd

MariaDBサービスを起動する。

データベースサーバを起動します。

# systemctl start mariadb
# systemctl enable mariadb

データベースサーバはこれで起動しますが、この後にデータベース自体を構築します。

データベースの作成

以下のコマンドを実行し、データベースを作成します。
なお、データベースの作成に関して、各種パラメタをサンプルです。実際のデータベース作成時には、ユーザIDやパスワードを十分に考慮して設定してください。

# mysql -u root -p
> CREATE DATABASE `concrete5` CHARACTER SET 'utf8';
> CREATE USER 'concrete5'@'localhost' IDENTIFIED BY 'concrete5';
> GRANT ALL ON concrete5.* TO 'concrete5'@'localhost';
> quit

Firewallの設定

ファイアーウォールが有効になっていると思いますので、HTTPプロトコルが通過できるように設定を施します。

# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

concrete5本体の設置

以下のURLをブラウザで開いて、最新版をダウンロードしましょう。
http://www.concrete5.org/download

Firefoxでダウンロードすると「ダウンロード」フォルダーに保存されますよね。

 

ここから適当なフォルダーへ移動して、解凍して、移動して、パーミッションの設定をイジイジして。。。。という流れを行います。

# mkdir /home/tmp
# mv /root/ダウンロード/concrete5-8.4.3.zip /home/tmp
# cd /home/tmp
# unzip concrete5-8.4.3.zip
# mkdir /var/www/html/contents
# mv concrete5-8.4.3/* /var/www/html/contents
# cd /var/www/html
# chown -R apache:apache contents
# chcon -R -t httpd_sys_script_rw_t contents

以上で設置完了です。

うぅーーーーーーー長い!

でも一応のインストールは出来たはずです。
ここからは、順次設定を進めます。

試しに、インストールしたconcrete5を覗いてみましょう!
以下のURLを指定すると閲覧できます。
(リモートで作業を行っている場合はIP

http://localhost/contents/

こんな画面が表示されれば、一応のインストール作業は完了です。

各種設定

言語設定

言語設定を変更します。
「日本語(日本)」を指定します。
#お好きにどうぞ!

環境チェック

実は、ここで「MSQL PDOエクステンションが有効です。」の項目がエラーになっていた。
インストール漏れはなく、設定もされていた。
結論は、Apacheが起動した状態でphp-pdoをインストールしたため、Apacheがphp-pdoを認識していなかったことが原因であった。
Apacheを再起動(systemctl restart httpd)を行うことで、認識した。

ここでは、チェックだけなので、問題がなければ「インストールを続ける」とし次へ進める。
ここで問題があった場合には、必要なパッケージをインストールするなどの対応が必要となる。

サイト情報登録

ここではサイトに関する情報を登録する。
「名前」はサイトの名称となります。
「管理者メールアドレス」は登録会員向けの発信元メールアドレスにもなります。その他、障害通知などもくるのかな?
「管理者パスワード」は編集する際などにログインする場合に使うパスワードになります。データベースのパスワードとは別にした方が良いでしょう。
データベースの各項目にはデータベース作成時に指定した内容を指定します。
今回の例では、
サーバー:localhost
MySQLユーザ名:concrete5
MySQLパスワード:cocrete5
データベース名:concrete5
となっていますが、実際のユーザ名パスワードデータベース名は十分の考慮の上設定してください。
セキュリティ上、上記の設定は宜しくありません。

「concrete5をインストール」ボタンでインストールが開始されます。

しばらく待ちます。

終わったら。。。

これで、concrete5のインストールは完了です。

「サイトを編集」ボタンをクリックすると、編集画面へ遷移します。

編集画面

編集画面をログアウトするには、右上のメニューボタンからログアウトすることが出来ます。

また再度ログインする際には、管理者ユーザが設定されています。
管理者のIDは「admin」です。
パスワードは、設定画面で設定したパスワードとなります。

ログインが上手く行かない場合には、ファイアーウォールを一度停止してみるとか、SELinuxを一度Permissiveにしてみるなどを試してみてください。

今回は以上です。
お疲れさまでした。

その内、操作方法などもアップしてみたいと思います。

MantisをCentOS 7へインストールする。

Mantisのインストールは比較的に楽だということで、インストールしてみた。

最初は順調にインストール出来たのだが、データベース絡みのセキュリティに引っ掛かったために大幅に時間をロスすることとなった。

CentOS 6までならばその問題に遭遇することなくインストール出来るようです。

CentOS 6でも下記のインストール方法でインストール出来るはずですが、CentOS 7では少しだけ設定が追加になりますので、その点も記載しながらインストール方法をまとめます。

インストール準備

まずは動作環境について整理します。

対象OS:7.3.1611
Web:Apache 2.4.6
mariadb:15.1
php:5.4.16

今回は、OSのみインストール済みでした。各種パッケージは順次インストールします。

今回インストールを行ったマシンのH/W環境は以下の様な感じです。
4コア程度の安価なマシン。
メモリは16GB入れていますが、4GBとかでも十分に動くでしょう。
HDDは。。。たまたま無かったので、空いていたSSD500GBを使いましたが、基本的にそんなスペックは必要ありませんw
実際に必要な環境は調べていませんが、各々で必要に応じて調べてください。

インストール作業

これからインストール作業を開始します。

nkfを入れたりしないのであれば多分必要ないのですが、何かとデフォルトのリポジトリだけだと足りなくって、結局入れることになるのがEPELリポジトリなんですよねw

そこで、面倒なことは先に済ませておこうということで、EPELリポジトリを登録しておきます。

EPELリポジトリ

# yum install epel-release

デフォルトで使うとか使わないとか・・・あるけど、取りあえず無視します。必要な人は、一通りインストールが終わった後で設定してください。

Apache

yumを使って簡単にインストールします。

# yum install  httpd mod_ssl

いろいろと設定を行うところはありますが、Mantisを入れることが目的ですから、簡単なインストール方法だけです。
セキュリティ面など詳細な設定を行いたい方は、別途調べてください。

Apacheを起動します。

# systemctl start httpd

CentOS 6では、

# service httpd start

自動起動の設定を行います。

# systemctl enable httpd.service

CentOS 6では、

# chkconfig httpd on

なんとなく、CentOS 6と7の違いがわかると思います。
これ以降はsystemctrl/service/chkconfig関連のCentOS 6および7による違いに関しては省略し、CentOS 7の設定方法のみ記載します。

nkf

文字コード変換ツールのnkfをインストールします。
どこのサイトにもMantisインストールに際し必要という記載は無かったのですが、readme.txtなどの日本語が入っているファイルでSJISが使われているところがあったのでインストールしました。
普通は使いませんが、必要になった時の為と思ってください。
要らない人は無視してください。

こちらも簡単に。。。

# yum install nkf

PHP

こちらも簡単にyumでインストールします。

# yum install php php-mysql php-mbstring

ntpとwget

時間を管理するためにNTPをインストールします。
またついでになりますが、wgetをインストールします。
wgetはファイルをダウンロードする際に使用しますが、今回は直接使用しません。
Mantisが使うために必要になるみたいです。

# yum install ntp wget

ここで少しタイムゾーンの設定だけしておきます。

多分、Mantisをこのまま入れてしまうと、時間の設定がゴチャゴチャするのかも知れません。意外と問題ないのかも知れませんが、取り敢えず。

# vi /etc/php.ini

内容は以下です。
タイムゾーンを指定しています。

[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
;date.timezone =
date.timezone = Asia/Tokyo

該当箇所を修正してください。

mariadb

さて、CentOS 7からMySQLがmariadbに変更となっていることは既にご承知のことと思います。

ということで、以下のコマンドを実行してみてください。

# yum list installed | grep mariadb
mariadb-libs.x86_64             1:5.5.56-2.el7

OSのインストール手順によってこの辺りの環境はことなりますが、私の環境ではmariadb-serverが不足していました。

ということで、mariadb-serverをインストールします。

# yum install mariadb-server

続いて、mariadbを起動します。

# systemctl status mariadb
●mariadb.service - MariaDB daabase server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
# systemctl enable mariadb.service
# systemctl start mariadb.service

 

データベースの作成

mantisで使用するデータベースを作成します。

※MySQLのバージョンは大丈夫ですか?バージョンが古い場合、この後の作業を進めてしまうと後で面倒なことになります。十分注意してください。

mysqlへアクセスします。

mysql -u root

DBを作成します。

mysql> CREATE DATABASE bugtrackerdb;
mysql> CREATE USER mantisuser@localhost IDENTIFIED BY 'db_user';
mysql> GRANT ALL ON bugtrackerdb.* TO mantisuser;

※db_userについては、適当な名称を指定してください。
※その他mantisuserやbugtrackerdbについても適当に名称変更してください。

CentOS 6では、この設定だけで基本的にDBへのアクセスが許可されるのですが、CentOS 7ではもう少し作業を行います。

 

Mantisインストール

下準備が上記までの手順で完了しました。
ここからがMantisインストールの本丸です。

下記URLへブラウザでアクセスします。

https://sourceforge.net/projects/mantisbt/

「Download」のボタンをクリックすることでダウンロードされます。

ダウンロードを適当なディレクトリへ保存します。

ダウンロードしたファイル:mantisbt-2.5.0.zip

ファイルを解凍します。

unzip mantisbt-2.5.0.zip

解凍して得られたディレクトリを移動します。

mv mantisbt-2.5.0 /var/www/html/mantisbt

所有権の変更を行います。

chown apache:apache -R /var/www/html/mantisbt

ブラウザで以下のアドレスにアクセスします。

https://127.0.0.1/mantisbt/admin/install.php
※必ずローカルでアクセスしてください。外部からIPアドレスを指定しても上手く出来ない気がします。

 

CentOS 6であれば、これで上手く行くはずなのですが、CentOS 7ではエラーが発生します。

ブラウザ画面ではこれ以上何をやっても駄目でした。
パスワードを変更してみたりいろいろと手をつくしましたが、結局はlocalhostでアクセスを行える様にする際にパスワードをきちんと登録してあげる必要があるみたいです。
他の解決方法もあると思いますが、私はそれで解決しました。

では具体的に解決します。

ブラウザの「戻る」ボタンで戻ります。
駄目なら再読込みするなど元の画面に戻ります。

MySQLへ再度アクセスして、以下のコマンドを実行すると登録されているユーザ一覧が表示されます。

select Host, User, Password from mysql.user;
MariaDB [(none)]> select Host, User, Password from mysql.user;
+-----------------------+------------+-------------------------------------------+
| Host                  | User       | Password                                  |
+-----------------------+------------+-------------------------------------------+
| localhost             | root       |                                           |
| localhost.localdomain | root       |                                           |
| 127.0.0.1             | root       |                                           |
| ::1                   | root       |                                           |
| localhost             |            |                                           |
| localhost.localdomain |            |                                           |
| %                     | mantisuser |                                           |
| localhost             | mantisuser | *60E011DB435E0C2761CFC05F4D78A3FA39B912BD |
+-----------------------+------------+-------------------------------------------+
8 rows in set (0.00 sec)

ここで注目するのは、mantisuserが2つあります。

localhostと%になっている行が2つあります。

片方は何かパスワードが設定されているようですが、もう片方の%になっている方はパスワードが設定されていません。

そこにパスワードを設定します。

SET PASSWORD FOR mantisuser = PASSWORD('****');

****には適当なパスワードを指定してください。

同じようにlocalhost側のmantisuserにもパスワードを再設定します。

SET PASSWORD FOR mantisuser@localhost = PASSWORD('****');

 

先程と同じようにブラウザの画面で登録を行います。

そうするとエラーが取れました。

少し画面を省略しますが、最後のところに以下の記載が確認できます。

「Continue」をクリックすると、ログイン画面が表示されます。

初期のIDとパスワードは

ID:administrator
パスワード:root

になっています。

ログインすると以下の画面が表示されます。

 

新しいIDとパスワードを設定します。

まだ、メールの設定が出来ていませんが、一応の設定を済ませます。

「更新」しますと、再度ログイン画面が表示され新しいパスワードでログインを求められます。

再度ログインを行うと以下の画面が表示されます。

 

日本語化されていない場合は、以下の設定をconfig/config_inc.phpへ追加します。

$g_default_language = 'japanese';

以上でMantisのインストールは完了です。

メールの設定はまた別の機会に記載します。

 

 

CGIでソケット通信を行えるようにするには、SELinuxの設定変更が必要

Linux上のApacheでCGIを利用してソケット通信を行いたい場合がありますが、SELinuxではデフォルトで許可されていません。

今回は、CGIでftp通信を行おうとしたのですが、拒否されてしまいました。

対策としては、SELinuxの設定を変更してApache(httpd)から発行されたソケット通信を含む処理を許可してあげます。

以下はその方法です。

まずデフォルトの設定状態を確認します。

# getsebool -a | grep httpd_can_network
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off

次にhttpd_can_network_connectを許可します。

# setsebool -P httpd_can_network_connect on

再度、設定内容を確認します。

# getsebool -a | grep httpd_can_network
httpd_can_network_connect --> on
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off

これで、ソケット通信は可能になります。

 

Apache DocumentRoot以外のディレクトリをシンボリックリンクで繋げたら、Forbidden 403 エラーの対策

Linux上のApacheでDocumentRoot以外の場所を参照できるようシンボリックリンクで接続したら、Forbiddenと表示されました。

Forbidden
You don’t have permission to access /user_dir/hoge.html on this server.

パーミッションや所有者をApacheに変更してみたり、色々試した結果SELinuxを無効にすることで正常に動作することを確認しました。

# setenforce 0
# getenforce
Permissive
#

Permissiveになっていれば、SELinuxはモニタリング状態でありアクセス制御は掛かっていない状態になっています。

SELinux事態を無効(モニタリング状態)にしておくのは、あまり良いことではありません。

出来ればアクセス制御は正常に行われている状態にすべきです。

アクセスできない原因がSELinuxのアクセス制御に影響されることが確定されたら、以下の操作を行うことでこの問題を解決することが出来ます。

さて、一般にパーミッションの確認などをする際には、ls -laなど個人差はありますがlsコマンドを使います。
SELinuxコンテキストも同じように確認することが出来ます。
コマンドは以下になります。

# ls -Z [対象ファイル/ディレクトリ]

通常のファイルはこんな感じです。

-rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 hogehoge.txt

さてSELinuxコンテキストを変更するには、まず最初に対象となるディレクトリに対して設定を行います。

# semanage fcontext -a -t httpd_sys_content_t "/user_dir(/.*)?"

続いて、対象ディレクトリ内のすべてのファイルとフォルダーに対して設定を反映します。

# restorecon -R -v /user_dir

対象ディレクトリ以下に多量のファイルがあると、時間が掛かる場合があります。
SELinuxを有効にします。
SELinuxの有効化は以下のコマンドを実行します。

# setenforce 1
# getenforce
Enforcing
#

最後にブラウザで動作確認を行ってください。

これでもForbiddenが表示される場合は、上記の操作に問題があるか?本当にパーミッションが間違っていないか?確認してください。

ついでに確認方法を記載します。

上記でも記載したとおり以下のコマンドで確認します。

# ls -Z [対象ファイル/ディレクトリ]
-rw-r--r--. root    root    unconfined_u:object_r:httpd_sys_content_t:s0 hogehoge.txt

設定が変更されているのが解ると思います。

 

 

 

Azure環境のCentOS 7でOpenVASを使えるようにするための設定

前回までで、取りあえずOpenVASのインストールを行いました。

ここで、Auzre環境を設定しないと接続出来ないことを思い出しました。

以前に提供されていたネットワークの設定で「エンドポイント」を指定するのと同じく、ファイアウォールのポートを解放してあげないと、接続出来ないんですね(^^ゞ

「Virtual Machine」から、今回の仮想マシンを選択し、「パブリックIPアドレス/DNS名ラベル」→「設定」へ進みます。

 

更に、「構成」→「DNS名」を入力します。

これで、ドメイン名の設定が完了します。

ここから、ポートを解放します。

同様に、仮想マシンを選択して、「リソースグループ」→「ネットワークセキュリティグループ」(画面のマークを探してください)を選択します。

「受信セキュリティ規則」を選択すると、以下の画面が表示されます。

「追加」を押して、「受信セキュリティ規則」に必要な項目を追加します。

今回は、HTTP(80)とOpenVASが使用するポート番号(デフォルトで9392)を開放します。

IPアドレスによる制限をする場合等、適宜必要に応じて設定してください。

設定が完了すると以下の様に設定した項目が追加されます。

これで、ポートが開放されましたので、ドメイン名を指定してブラウザで開いてみます。

https://ドメイン名/

開かない場合は、httpdが起動していない可能性があります。
前回の設定を確認してみてください。

更に、OpenVASの画面を開いてみます。

https://ドメイン名:9392
httpではなくhttpsであることに注意してください。
本来ならば、以下の画面が表示されるはず・・・なのですが、残念ながらセキュリティ警告画面が表示されると思います。

ブラウザにより異なりますので詳細は記しませんが、表示された画面の「詳細設定」などのリンクをクリックして、そこに掛かれている記述を確認しながら無理やりアクセスを行ってください。

場合によっては、セキュリティ例外に登録する必要があります。

すると、ログイン画面が表示されます。

設定したログインIDとパスワードを入力して設定の再開です。

次回はOpenVASの設定方法について更に続けます。

 

OpenVASをAzureのCentOS 7へインストールしてみる!

さてと、今回はAzureのCentOS 7へOpenVASをインストールしてみることにした。

AzureのCentOS 7と言っても、何が変わる訳でもないのだが、rootユーザが使えないだけw

自前でサーバ立てたら、rootユーザ使えるんだけど、今回はお試し気分がテンコ盛り状態なのでAzureで作ることにした。

AzureでCentOSの環境を作る方法については、他のサイトを参考にしてください。(「名前」とかに日本語入れるとデプロイ出来ないっぽいので注意かな?)

ちなみに、Azureで作った環境は、1コア メモリ3.5GBのスタンダードなものです。HDDは30GB程度かな?非常にプアなマシンですw

1.OSの更新

取りあえず、ログインして最初にすることは、環境を新しくしておくこと。

現時点(2016年5月初旬)で作業を行いました。

$ sudo -y yum update
(省略)

$ more /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
$

現在のバージョンは/etc/redhat-releaseを確認することで得られます。

その他、適当に/etc/bashrcや~/.bashrcを書き換えて、自分なりの環境を作っておきます。

2.Apacheのインストール

次に、なんとなくApacheが入っていない様なので、Apacheをインストールしておきます。

こちらもyumでインストールします。

$ sudo yum -y install httpd
(省略)

 (まだ動いていない状態でステータスの確認)
$ service httpd status
Redirecting to /bin/systemctl status  httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)
(ここで、サービスを起動する)
$ sudo service httpd start
Redirecting to /bin/systemctl start  httpd.service

(動いているかどうかをステータスで確認)
$ service httpd status
Redirecting to /bin/systemctl status  httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2016-05-10 10:46:56 UTC; 13s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 10140 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           tq10140 /usr/sbin/httpd -DFOREGROUND
           tq10141 /usr/sbin/httpd -DFOREGROUND
           tq10142 /usr/sbin/httpd -DFOREGROUND
           tq10143 /usr/sbin/httpd -DFOREGROUND
           tq10144 /usr/sbin/httpd -DFOREGROUND
           mq10145 /usr/sbin/httpd -DFOREGROUND

最後に、OS再起動時に自動起動する様に設定する。

$ sudo chkconfig httpd on

以上でApacheのインストールは完了です。
詳細なApacheの設定は省略します。

3.OpenVASのインストール

yumを使ってOpenVASをインストールします。

まずは、リポジトリを登録します。

$ sudo rpm -ivh https://www6.atomicorp.com/channels/atomic/centos/7/x86_64/RPMS/atomic-release-1.0-20.el7.art.noarch.rpm
Retrieving https://www6.atomicorp.com/channels/atomic/centos/7/x86_64/RPMS/atomic-release-1.0-20.el7.art.noarch.rpm
warning: /var/tmp/rpm-tmp.IgujPQ: Header V3 RSA/SHA1 Signature, key ID 4520afa9: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:atomic-release-1.0-20.el7.art    ################################# [100%]

次にいよいよOpenVASをyumを使ってインストールします。

$ sudo yum -y install openvas

途中で問い合わせがあるかも知れませんが、基本的に「y」でOKです。

Complete!

と表示されればOKです。

4.OpenVASの設定

OpenVASの設定を行います。

$ sudo openvas-setup
Openvas Setup, Version: 1.0


Step 1: Update NVT, CERT, and SCAP data
Please note this step could take some time.
Once completed, this will be updated automatically every 24 hours

Select download method
* wget (NVT download only)
* curl (NVT download only)
* rsync

  Note: If rsync requires a proxy, you should define that before this step.
Downloader [Default: rsync]

最初に、rsyc使うかどうか聞かれるので、Enter押して次へ。

ここでしばらく更新を待ちます。10分くらいかな?

その後、いきなりこんなメッセージが表示されます。

Step 2: Configure GSAD
The Greenbone Security Assistant is a Web Based front end
for managing scans. By default it is configured to only allow
connections from localhost.

Allow connections from any IP? [Default: yes]

気にせず「Enter」ですね(^^ゞ

Redirecting to /bin/systemctl restart  gsad.service

Step 3: Choose the GSAD admin users password.
The admin user is used to configure accounts,
Update NVT's manually, and manage roles.

Enter administrator username [Default: admin] : xyz
Enter Administrator Password:
Verify Administrator Password:

ユーザネームを聞かれます。
adminのままで良いのですが、Azure環境で使用するため、安全のためにデフォルト設定から適当なユーザ名に変更しておきます。
パスワードを入れて次へ。

Redirecting to /bin/systemctl start  redis.service

Setup complete, you can now access GSAD at:
  https://<IP>:9392

Created symlink from /etc/systemd/system/multi-user.target.wants/openvas-scanner.service to /usr/lib/systemd/system/openvas-scanner.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openvas-manager.service to /usr/lib/systemd/system/openvas-manager.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/gsad.service to /usr/lib/systemd/system/gsad.service.
$

なんかよく解らないうちにインストールは完了した模様。。。。

一旦、OpenVASのインストールは一旦ここまでにします。

Web画面から設定を行うことになるのですが、その前にAzure環境の設定を行う必要があります。

次回は、その設定方法について記載します。

 

Access-Control-Allow-Origin 対策

クロスサイトの対策で調べていると、Access-Control-Allow-Originの対策が書かれているサイトがいくつか見つかった。

こんな感じの.htaccessファイルを作って、設置すればと書いてある。

Header append Access-Control-Allow-Origin: *

で、実際にやってみると、駄目だったりする。

もしやApacheの設定が必要?かなぁと思っていると、やはりあった!

LoadModule headers_module modules/mod_headers.so

こいつを追加しておかないと先の設定は有効に機能しない。