タグ「Linux」の 記事 8 件中 1 ~ 8 件を表示しています。

ちょっと前から Google Chrome などのブラウザで従来の HTTP 接続だとこのサイトへの接続は保護されていませんと警告表示が出るようになった。 この Blog では特にセンシティブな内容を扱ってはいるわけではないのだが、何となく気になってはいた。 しかし従来は SSL 証明書は有料が当たり前だったので自分の趣味でやっている Blog の SSL 化にお金をかけるのも躊躇うところだったが、昨今では Let's Encrypt という 90 日単位での証明書の更新作業が必要だが無料の SSL 証明書が出てきたので重い腰を上げた。

Qiita の記事で【apache】conohaのUbuntu18.04にLet's EncryptでSSL設定するまでというピッタリなものがあったので記事通り作業したら難なく対応できた。 Laravel で既に用意されている .htaccess に HTTPS へのリダイレクト処理を入れるのを試してみたが、なぜか個別記事に HTTP でアクセスされた際に URL が消失してしまい index.php へのアクセスになってしまう問題を発見して、これが解決できない。 と思ったらただ単に RewriteCond - Rule の記述の最後に入れてしまっていたので index.php へのリダイレクト後に HTTPS へのリダイレクトが走ってしまっていたからだった。 HTTPS へのリダイレクト処理を一番上に書くようにしたらうまくいった。

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # HTTP を HTTPS にリダイレクト
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
コジオン
2020-01-31 14:01:42
コメントテスト。

Redmine のインストールは面倒

基本的に Redmine のインストールは面倒なイメージがある。 特に apt を使わずにインストールした場合などとても煩雑だ。 ここではすべて apt を使用してパッケージからインストールするものとし、且つ MySQL は utf8mb4 問題 (MySQL はデフォルトの utf8 だと絵文字などの 4 バイト文字が入力できない) があるので避け、最も簡単な SQLite を使用することにする。 SQLite だとデータベースがただのファイルなのでバックアップがとても簡単だし、ユーザという概念もないのでユーザを作成したりパスワードを設定する必要もない。 既に MySQL / PostgreSQL で構築されている Redmine のデータを移行するのなら話は別だが、大体の場合 SQLite で事足りるはずだ。

インストール

sudo apt install redmine-sqlite

途中画面が切り替わり以下の質問をしてくるので「はい」を選択すると DB が作成され Redmine のマイグレーションファイルが走る:

redmine/instances/default パッケージを使用する前に、データベースをインストールして設定する必要があります。これは必要に応じて dbconfig-common で処理することもできます。 あなたが上級データベース管理者で、手動でこの設定を実行することがわかっている場合、あるいはデータベースのインストールと設定が完了している場合は、このオプションを拒否するべきです。何をすべきかの詳細は、/usr/share/doc/redmine/instances/default で提供されている可能性が最も高いです。 そうでなければ、おそらくこのオプションを選ぶべきです。 redmine/instances/default 用のデータベースを dbconfig-common で設定しますか?

更に以下も必要なので apt で入れる:

sudo apt install apache2 libapache2-mod-passenger bundler imagemagick libmagick++-dev

redmine-sqlite パッケージでインストールされた Redmine は /usr/share/redmine にある。 以下に示すのはサブドメインなしでデプロイする場合だがサブドメイン (たとえば http://redmine.hoge.com など) に配置する場合は適宜読み替えて欲しい:

sudo vi /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    DocumentRoot /usr/share/redmine/public
    PassengerHighPerformance on
    <Directory /usr/share/redmine/public>
            AllowOverride None
            Options None
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

また sudo vi /etc/apache2/mods-available/passenger.conf で以下のように書き換える必要がある:

<IfModule mod_passenger.c>
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby
  PassengerDefaultUser www-data
  RailsBaseURI /redmine
</IfModule>

Apache を再起動する:

sudo service apache2 restart

http://localhost/ (または適切なドメイン) にアクセスし Redmine の画面が表示されることを確認する。

バックアップ

Redmine の公式ドキュメントに示されている通り Redmine のインストールディレクトリ直下の files ディレクトリと SQLite ファイル (/var/lib/dbconfig-common/sqlite3/redmine/instances/default/redmine_default) をコピーするだけなので楽だ。

コジオン
2018-06-13 09:57:28
コメントテスト
takhidemo
2019-02-23 15:59:28
Rubyの事は全然わかっていないが、部署でRedmineを導入したいと言う考えで、公式のブログを見ながら試行錯誤してAWSのubuntuに構築をしておりましたが、上手く行かずに煮詰まっていた所でこの記事を見つけ参考にさせて頂きました。手順通りに行い、サブドメインの設定については別の記事を参考にした所、無事Redmineの立ち上げができました。ありがとうございました。
コジオン
2019-02-23 16:46:47
おお、お役に立てたようで良かったです。私も Ruby の事は全く分かっておりませんが、試行錯誤で何とかなりました。このくらい楽に構築できるのであればプライベートでのタスク管理やメモ帳代わりにも使えそうですね。

デフォルトだと -Xmx128m

この間この Blog システムを Tomcat (Spring Boot) 上で動作するように修正したのだが、それからどうも動作が緩慢になったように思っていた。 確かに Load Average を見ても高めの値を示している。 そして、画像をアップロードしたら OutOfMemoryError: Java heap space. でクラッシュした。 これはまずいと調査を開始した。

Tomcat のヒープサイズは Ubuntu Server のデフォルトの状態だと -Xmx128m (最大ヒープサイズ 128 M) になっている。 これは Tomcat 起動時に catalina.out にログ出力されているので確認する:

view /var/log/tomcat8/catalina.out

" CATALINA_BASE, CATALINA_HOME もログ出力されているので確認しておく
CATALINA_BASE:         /var/lib/tomcat8
CATALINA_HOME:         /usr/share/tomcat8
...(略)...
Command line argument: -Xmx128m

setenv.sh

Tomcat のヒープサイズを変更するために Tomcat 起動時に環境変数を渡すにはどうしたら良いのか調べてみたが setenv.sh を定義するのがいいらしい。 Ubuntu のデフォルトではこのファイルは存在しないので $CATALINA_HOME/bin 若しくは $CATALINA_BASE/bin に作成する必要がある。 Tomcat を起動するためにキックされる catalina.sh に以下のように書かれている:

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi

そこで $CATALINA_HOME/bin/setenv.sh に以下のように作成する:

export CATALINA_OPTS='-Xms256m -Xmx512m -Xss1024k -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled'

変更を適用するために Tomcat を再起動する:

sudo service tomcat8 restart

catalina.out を確認すると正しくこの値が使用されているのがわかる:

情報: Command line argument: -Xms256m
情報: Command line argument: -Xmx512m

また ps aux | grep tomcat8 のようにプロセスを検索しても良い。

Ubuntu 16.04 LTS を想定。 例えば hoge.kojion.com と fuga.kojion.com にそれぞれアプリをデプロイする場合を考える。 昨日の記事までの Tomcat 及び Apache 連携の設定は既に済んでいるものとする。

Tomcat 側の設定

sudo vi /etc/tomcat8/server.xml

以下のように <Engine> 内に必要な分だけの <Host> を用意する:

<Engine>
    ...
    <Host name="hoge.kojion.com"  appBase="hogeapps"
        unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="hoge_access_log" suffix=".log"
            pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    </Host>
    <Host name="fuga.kojion.com"  appBase="fugaapps"
        unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="fuga_access_log" suffix=".log"
            pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    </Host>
</Engine>

上記の設定でログが /var/log/tomcat8 に指定した prefix, suffix の形式で吐かれることになる。 この後 hogeapps ディレクトリと fugaapps ディレクトリを用意する (以下 fugaapps の操作は hogeapps と同様とする):

sudo cd /var/lib/tomcat8
sudo mkdir hogeapps
sudo chmod 777 hogeapps
sudo chown tomcat8.tomcat8 hogeapps

上記で作成した appBase のディレクトリにはこの後置く war ファイルが展開されて置かれる。 次に各ホストに対する設定ファイルを置く:

sudo cd /var/lib/tomcat8/conf/Catalina
sudo mkdir hoge.kojion.com
sudo vi hoge.kojion.com/ROOT.xml

以下に指定する docBase のディレクトリは任意の場所で良い (一般的に /home が置きやすいだろうということでそうしている):

<Context docBase="/home/user/hoge/ROOT.war"/>

後はこの docBase に指定したディレクトリに war ファイルを置けば、対象 URL に初回アクセスした際に appBase に war ファイルを展開してくれる。 ROOT というコンテキスト名にするとルートディレクトリへのアクセスで対象アプリが駆動する。 例えば http://hoge.kojion.com/hage で hage アプリが動作してほしい場合は war ファイル名を変更すれば良い:

sudo vi hoge.kojion.com/hage.xml
<Context docBase="/home/user/hoge/hage.war"/>

Apache 側の設定

sudo vi /etc/apache2/sites-available/hoge.conf

バーチャルホスト毎に設定ファイルを用意すれば良い:

<VirtualHost *:80>
    ServerName hoge.kojion.com

    ...

    <Location />
            ProxyPass ajp://localhost:8009/
            Order allow,deny
            Allow from all
    </Location>
</VirtualHost>

最後に sudo service tomcat8 restartsudo service apache2 restart し、試しに war ファイルを置いて http://hoge.kojion.com にアクセスして正しくアプリが稼働するのを確認する。

パッケージングを War にした場合

昨日の記事である Spring Boot を Kotlin で Hello Worldパッケージングを Jar でなく War でプロジェクトを新規作成した状態とする。 build.gradle の記述が少し変わるのだが、具体的には以下の部分だ:

apply plugin: 'war'

configurations {
    providedRuntime
}

dependencies {
    // ここをコメントアウトして Application を実行すると組み込みの Tomcat で実行できる
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
}

上記に書いた通り providedRuntime('org.springframework.boot:spring-boot-starter-tomcat') をコメントアウトすれば普通に Jar でビルドし組み込みの Tomcat で実行できる。 開発時はコメントアウトしておくのがいいだろう。 尚 War でプロジェクト作成した場合 ServletInitializer というクラスが増えているのが分かると思うが、これが無いと Tomcat で war ファイルをデプロイしても実行できない。

war ファイル作成

上記の状態で普通に Gradle のビルドを行うと build/libs 直下に war ファイルが作成される。 尚ファイル名は (プロジェクト名)-(Gradle に指定している version).war となるようだ。

Ubuntu 側の用意

今回はローカルの仮想環境に Ubuntu Server 16.04.3 LTS をセットアップしてあるものとする。 後今回は便宜上 Oracle の Java ではなく OpenJDK とする。

sudo apt install apache2 openjdk-8-jdk tomcat8 tomcat8-admin

これで Tomcat がインストールできたので http://(仮想環境の IP):8080/ にアクセスし Tomcat の稼働を意味するスタートページが表示されることを確認する。 仮想環境の場合ネットワークの設定を「ブリッジアダプタ」などホスト PC から IP が見える状態にしておかないといけないので注意する。

tomcat8-admin をインストールしたので http://(仮想環境の IP):8080/manager にアクセスすると Tomcat 管理画面に遷移することができるが、最初の認証の為のユーザを設定しなければならない。

sudo vi /etc/tomcat8/tomcat-users.xml

以下を追記する。 ユーザ名とパスワードは適宜強固なものに変更する。

<tomcat-users>
    ...
    <user username="admin" password="admin" roles="manager-gui,admin-gui"/>
</tomcat-users>

Tomcat を再起動し設定を反映する:

sudo service tomcat8 restart

これで http://(仮想環境の IP):8080/manager にアクセスし設定したユーザ名とパスワードを入力し認証、正しく管理画面が表示されるのを確認する。 更に管理画面上から前述の手順で作成した war ファイルをデプロイし、正しくアプリケーションのページが表示されるのを確認する。

Apache との連携

これは UbuntuでTomcat Apache連携がとても参考になった。 ほぼ記事のオウム返しになって恐縮であるが、まず以下で Tomcat の接続設定を変更する:

sudo vi /etc/tomcat8/server.xml

8080 ポートを閉じて proxy_ajp 連携用の 8009 版ポートを開く:

<!-- コメントアウト
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443" />
-->

<!-- コメントアウトを外す -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

次に sudo vi /etc/apache2/sites-available/000-default.conf し以下追記する:

<Location />
    ProxyPass ajp://localhost:8009/
    Order allow,deny
    Allow from all
</Location>

最後に proxy_ajp を有効にしそれぞれ再起動:

sudo a2enmod proxy_ajp
sudo service tomcat8 restart
sudo service apache2 restart

http://(仮想環境の IP)/(コンテキスト名) にアクセスし、正しく Spring Boot アプリケーションが表示されるのを確認する。 /etc/apache2/conf-available の方に設定を書いて sudo a2enconf xxx する方法もあるが、個人的にはバーチャルホストで設定を分ける時に今回記載した手順のほうが便利だと思った。

Vagrant

Vagrant が何かに関しては検索すれば幾らでも情報が出てくるのでここでは述べない。

まずは Vagrant をインストールする。 公式からダウンロードしてインストールすれば良い。 VirtualBox も入っていなければインストールしておく。

Ubuntu 16.04 LTS に関しては公式に box が提供されているのでそれを使用する:

vagrant init ubuntu/xenial64

これでカレントディレクトリに VagrantFile が出来るので、この中の以下の行のコメントアウトを外す:

" VM 上の 80 番ポートへのアクセスをホスト側の 8080 番ポートに変換する設定. 8080 が使用済なら適宜変更する
config.vm.network "forwarded_port", guest: 80, host: 8080

その後以下のコマンドを叩いて VM を起動する:

vagrant up --provider virtualbox

以下のコマンドで VM に SSH 接続する:

vagrant ssh

試しに Apache を導入し動作確認を行う:

sudo apt install apache2

http://localhost:8080/ にアクセスし、正しく Ubuntu の Apache テストページが表示されるのを確認する。

PHP 7.0

PHP 7.0 の環境を構築する。 Ubuntu 16.04 における PHP 7.0 関連の項目を検索するには以下のコマンドを叩く:

apt search php7.0

まとめて必要そうなのを入れてしまう:

sudo apt install libapache2-mod-php7.0 php7.0 php7.0-cli php7.0-intl php7.0-json php7.0-mbstring php7.0-sqlite3
/* sudo apt install php7.0-mysql */
/* sudo apt install php7.0-pgsql */

デフォルトの DocumentRoot が /var/www/html なのでそこに試しに PHP ファイルを置いてみる:

cd /var/www/html
sudo mv index.html index.html.old
sudo vi index.php

index.php の内容は以下とする:

<?php
phpinfo();

http://localhost:8080/ にアクセスし、正しく phpinfo が表示されるのを確認する。

DocumentRoot を /vagrant/xxx にする

デフォルトの DocumentRoot のままだとホスト側に /vagrant がマウントされる仕組みを活かすことが出来ないので変更する。 /vagrant/xxx だが xxx の部分は各自適当なプロジェクト名とする:

 sudo vi /etc/apache2/sites-available/000-default.conf

以下 DocumentRoot を編集しアクセス許可を与える:

DocumentRoot /vagrant/xxx
<Directory /vagrant/xxx>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

テスト用のページを用意しておく。 先程の phpinfo 再利用でよいだろう:

mkdir /vagrant/xxx
sudo mv /var/www/html/index.php /vagrant/xxx
sudo service apache2 restart

http://localhost:8080/ にアクセスし、正しく phpinfo が表示されるのを確認した上で DOCUMENT_ROOT/vagrant/xxx になっているのを確認する。

mod_rewrite 有効化

CakePHP 3 では mod_rewrite を使用しているが Ubuntu の Apache のデフォルトでは有効になっていないので以下で有効にしておく:

sudo a2enmod rewrite
sudo service apache2 restart

CakePHP 3 インストール

先程の index.php は不要なので消しておく:

rm index.php

CakePHP 3 のインストールに関しては公式のドキュメントが素晴らしいのでこれに従っておけば問題ない。 ただ composer create-projectzipunzip が必要なようなので以下で入れておく:

sudo apt install zip unzip

あと composer create-project で出来るプロジェクトがディレクトリに含まれているので (この例だと /vagrant/xxx のこと) /vagrant 直下で composer create-project するのがいい。

尚 DB ばデフォルトで MySQL を使用するように config/app.php に書かれているので例えば SQLite を使うつもりでそのまま http://localhost:8080 にアクセスしても「MySQL のドライバーが見つからない」といったエラーになってしまう。 これに関しては config/app.php を以下のように SQLite 用に直せば良い:

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Sqlite',  // Sqlite にする
        'persistent' => false,
        'host' => 'localhost',
        'username' => '',  // 空にする
        'password' => '',  // 空にする
        'database' => 'xxx.sqlite',  // 適当な SQLite ファイル名を書く
    ... (省略) ...
    'test' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Sqlite',  // こっちも Sqlite にしないと駄目
        'persistent' => false,
        'host' => 'localhost',
        'username' => '',  // 空にする
        'password' => '',  // 空にする
        'database' => 'test.sqlite',  // 適当な SQLite ファイル名を書く
    ... (省略) ...

これで http://localhost:8080 にアクセスしカラフルな Get the Ovens Ready ページが表示されれば開発環境構築完了である。

macOS Sierra で Vagrant をインストールするまではいいのだが、

$ vagrant box add xenial64 https://atlas.hashicorp.com/ubuntu/boxes/xenial64/versions/20160521.0.0/providers/virtualbox.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'xenial64' (v0) for provider: 
    box: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/xenial64/versions/20160521.0.0/providers/virtualbox.box
An error occurred while downloading the remote file. The error message, if any, is reproduced below. Please fix this error and try again.

などといってダウンロードできない。 ネットワークが悪いのかと思ってブラウザでアクセスしてみるも正しく box ファイルがダウンロードできた。

teratail で似たような話があり、その回答で解決できた。 どうも Vagrant に同梱されている cURL がうまく動かない模様なので、

sudo rm /opt/vagrant/embedded/bin/curl

で無事 vagrant box add できた。

ConoHa でようやく Ubuntu 16.04 LTS のイメージが用意されたので早速我がコジオニルクも CentOS 7.0 から移行してみた。 仕事で CentOS を恒常的に使用しているというのなら別だが、そうでなければ Ubuntu の方が何かとパッケージも新しいし使い勝手が良い。

ただ Ubuntu 公式から ISO をダウンロードして VM にインストールした場合と初期状態が少し異なる:

  • root ユーザしかいない
  • ロケールが英語

一般ユーザ作成

ConoHa の Web 上のコンソールからログインする。 root ユーザでパスワードは登録時のものを入力する。

ログインできたら、まず一般ユーザを追加する。 hoge ユーザを登録するとすると以下となる:

adduser hoge
gpasswd -a hoge sudo  # sudo 権限追加

SSH 設定

ConoHa の Ubuntu イメージは openssh-server は最初から入っているのでその設定をする。

vi /etc/ssh/sshd_config

Port 99999  # 使われていないポートなら何でも良いがデフォルトの 22 だと攻撃を受けるので変更しておく
PermitRootLogin no  # root で SSH ログインできるようになっていると非常に危険なので
PasswordAuthentication yes  # パスワード認証を使わない場合は OFF
GSSAPIAuthentication no  # GSSAPI を使うなら yes だが使わないなら no で (SSH 接続が遅くなる場合がある)
AllowUsers hoge  # SSH 接続を許可するユーザを制限する事でセキュリティを確保

service ssh restart

ConoHa コンソールを閉じ Putty などの SSH クライアントや各種コンソールから SSH を試みて正しく接続できることを確認する。

ホスト名

何故か ConoHa でインストールした直後は /etc/hosts/etc/hostname の値が異なっている為 sudo で何かする度に unresolved host などと怒られる。 例えばホスト名を conoha とする場合は以下となる:

sudo vi /etc/hosts

127.0.1.1 conoha

sudo vi /etc/hostname

conoha

その後再起動 sudo reboot し正しくホスト名が適用されている事を確認する。

日本語化

英語のままでも別に問題は無いが日本人として日本語の方が分かりやすいのは確かである。 Server World 様の記事 をそのまま実施すれば良い。