2016年10月31日月曜日

ARMクロスコンパイル用clang その3

前々からautoconfではなく、cmakeでのビルドを推奨していたLLVMだが、ついにautoconfのサポートが無くなってしまった。
そこでcmakeでのARMクロスコンパイラのビルド方法を記載しておく。


(1)LLVM(Clang含む)のソースコード一式を適当なフォルダに展開する
 展開の仕方は公式のGetting startedを参照
(2)LLVMのフォルダとは別の場所にビルドフォルダを作成し移動する.
(3)以下のようにcmakeを実行すればMakefileが生成される

cmake <LLVMフォルダパス> -DCMAKE_CROSSCOMPILING=True -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="ARM;AARCH64" -DCMAKE_INSTALL_PREFIX=<ビルドしたバイナリのインストール先パス> -DLLVM_TARGET_ARCH=ARM -DLLVM_DEFAULT_TARGET_TRIPLE=arm-none-eabi

(4)make; make install

2016年8月11日木曜日

ARMクロスコンパイル用clang その2

ARMクロスコンパイル用clangの続き

普段使っているのがWindowsなのでWindows上でもARMクロスコンパイルclangを作成して見る
自作OS向けなのでベアメタルビルドでOK。
ライブラリ無しのコンパイラのみなのでビルドはシンプル。

■準備
msys2 32bit版を導入

(1) https://msys2.github.io/ から msys2-i686-[hhhhmmdd].exe をダウンロードして実行する
(2) メニューからMinGW-w64 Win32 shellを選択してターミナルを出す
(3) ターミナルからシステムアップグレード
     pacman -Syu --noconfirm

(4) ターミナルを1度閉じる
(5) エクスプローラから C:\msys32\mingw32.exe を実行する
  アップグレードするとメニューからのターミナル起動ショートカットがなぜか効かなくなるので直接実行

(6) clangビルドに必要なパッケージをインストール
     pacman -S base-devel mingw-w64-i686-toolchain python --noconfirm

■binutils, clangをビルド
   ビルド用スクリプトbuild-arm-clang.shを用意

(使用方法)
  build-arm-clang.sh [binutilsバージョン] [llvm/clangバージョン]
  何も指定しないとbinutils-2.27, llvm-3.8.1 になる


2016年7月30日土曜日

Nginx + Redmine

■前提
nginx, Redmine(ruby, bundler, unicorn含む)はインストール済みとする

■nginxの設定
/etc/nginx/sites-available のサーバー設定に以下を追加

upstream unicorn {
    server unix:[redmineインストールパス]/tmp/unicorn.sock fail_timeout=0;
}

server {} の中に locationを追加

location /redmine {
    alias [redmineインストールパス]/public;
    try_files $uri/index.html $uri.html $uri @unicorn;
}

location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
}

■Redmineの設定
sub-uri /redmine で動作するように若干変更

[redmineインストールパス]/config/routes.rb の以下の部分を変更

(変更前)
Rails.application.routes.draw do
  root :to => 'welcome#index', :as => 'home'
  ・
 ・
 ・
end

(変更後)
Redmine::Utils::relative_url_root="/redmine"

Rails.application.routes.draw do
scope Redmine::Utils::relative_url_root  do
  root :to => 'welcome#index', :as => 'home'
  ・
 ・
 ・
end
end

■Redmineの起動
cd [redmineインストールパス]
bundle exec unicorn -c config/unicorn.rb -E production -D

これでunicorn経由でRedmineがデーモン状態で立ち上がる

■nginx再起動
service nginx restart

2016年2月14日日曜日

Gitoliteサーバ

■サーバ設定
・/var/lib/gitolite3/.gitolite.rc
  UMASK 0700がデフォルト(rwx --- ---)。
 redmine等の管理システムからリポジトリ参照したい場合は0027(rwxr-x---)としてグループからの読み込みも許可しておく
  こうしないとgit でpushするたびにredmineからリポジトリ参照できなくなる

App 13972 stderr: fatal: Failed to resolve HEAD as a valid ref.
App 13972 stderr: fatal: Not a valid object name HEAD:

こんな感じのエラーログが出る。

■ユーザー追加
・Unixユーザー追加
  useradd [ユーザーID]
  passwd [ユーザーID]

・SSHキーペア生成
  ssh-keygen -t rsa -b 2048
  パスフレーズ入力して作成完了
  id_rsa(秘密鍵), id_rsa.pub(公開鍵)の2つが生成される。

・gitoliteに追加
  gitolite.conf のアクセスリポジトリにユーザーと権限追加
  keydirフォルダに公開鍵を追加

ubuntu 14.04 + nginx + SSL立ち上げ

■apt準備
/etc/apt/sources.list に以下を追加

deb http://nginx.org/packages/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/ubuntu/ trusty nginx

■パッケージインストール
apt-get update
apt-get install nginx

■設定
nginxのサイト設定は以下のどちらかのフォルダに設定することが出来る。
/etc/nginx/conf.d
/etc/nginx/sites-available

運用方針は人それぞれだが共通設定をconf.dに置き、サイト設定はsites-availableに置く。
有効にするサイト設定は/etc/nginx/sites-enabled/からシンボリックリンクを貼る

(1)サーバー共通設定作成
/etc/nginx/conf.d/default.conf を拡張子を変えて保存
/etc/nginx/conf.d/example_ssl.confを拡張子を変えて保存

/etc/nginx/conf.d/default.conf を新たに作成し中身を以下にする

========== ここから ==========
server {
    listen 80;
    listen [::]:80;

# httpへのアクセスをhttpsへリダイレクトする
#    return 301 https://$host$request_uri;     <= 後でコメントをはずす
}
========== ここまで ==========

(2)PFS用パラメータを生成
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
openssl dhparam 2048 -out dhparam.pem

■サイト設定
(1)サイト設定の有効化
/etc/nginx/nginx.confの末尾に以下を追加

include /etc/nginx/sites-enabled/*;

(2)サイト設定の作成
/etc/nginx/sites-available/defaultのコピーを作成する

root および server_name を適宜設定
apache2からの移行ならroot は /var/www/html で良いかもしれない

(3)サイト設定の有効化
cd /etc/nginx/sites-enabled
ln -s /etc/ngingx/sites-available/<(2)でコピーしたサイト>

■let's encryptインストール
sudo su
cd /usr/share  <= どこか適当な場所でよい
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

依存関係が自動でインストールされてヘルプが表示されれば成功

■証明書取得
./letsencrypt-auto certonly --webroot -w <WEBファイルルートフォルダ> -d <サイトドメイン名> -d www.<サイトドメイン名> -m <管理者メールアドレス> --agree-tos

www.<サイトドメイン名>オプションは必要に応じて。無くてもいい。
取得に成功すると /etc/letsencrypt/live/<ドメイン名>/に証明書ファイルが保存される。
保存されるのは以下4ファイル

cert.pem
chain.pem
fullchain.pem 
privkey.pem

■nginx SSL設定
(1)SSL設定
/etc/nginx/sites-available/ssl を作成し中身を以下にする

========== ここから ==========
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name <サーバーのドメイン名>;

    root <WEBファイルルートフォルダ>;
    index index.html;

    ssl_certificate      /etc/letsencrypt/live/<ドメイン名>/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/<ドメイン名>/privkey.pem;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;

    # サーバ側の暗号化スイートを優先する
    ssl on;

    # SSLプロトコルを安全なものだけ指定
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # 暗号化アルゴリズムはサーバーが指定.
    ssl_prefer_server_ciphers on;

    # 具体的に使うアルゴリズム以外は無効に設定
    ssl_ciphers  EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!EXPORT:!DES:!3DES:!MD5:!RC4:!DSS:!SHA1;

    # Perfect Forward Security (PFS)用パラメータ
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    # Online Certificate Status Protocol(OCSP)有効化
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;

    # HTTP Strict Transport Security(HSTS)有効化
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
}
========== ここまで ==========

(2)80ポートの扱い変更
最初に作成した/etc/nginx/conf.d/default.confの末尾のコメントをはずしポート80へのhttpアクセスはポート443のhttpsにリダイレクトする

この設定はお好みで。80をふさぐ場合は設定そのものを消す

■nginx起動
service nginx restart

■セキュリティ状態の確認
https://www.ssllabs.com/ssltest/index.html
ドメイン名を入力してテストしてもらう

■let's encrypt 証明書自動更新
/etc/cron.monthly/letsencrypt.shを作成

========== ここから ==========
#!/bin/sh
/usr/share/letsencrypt/letsencrypt-auto renew --force-renew
service nginx reload
========== ここまで ==========

[Grails] postgresql エラーメッセージ

例外発生時に文字化け

■対策
メッセージのロケール設定が悪いため発生。日本語だと厳しいので英語化

Windows:
C:\Program Files\PostgreSQL\9.1\data\postgresql.conf

Linux:
/etc/pgsql/postgresql.conf

lc_messages = 'Japanese_Japan.932' となっているのを lc_messages='C' にする

■Grails 2.4.0
・2.3.xからの変更点
  upgradeコマンドが無くなった。
  →バージョンアップはset-application-versionコマンドで行うこと
   またはapplication.propertiesを開いてバージョンを手動で上げる。このファイルを保存すると自動でアップデートが走り出す。

■spring-security-core
・1.xからの変更点
 パッケージが変更。grails.plugin.springsecurity.annotation.Securedが基本になった
 さらにメソッドに対してのみ@Securedアノーテーションが使用可能に。
 →web flowに対して設定できなくなった。さてどうしよう。

 Login/LogoutControllerがプラグイン埋め込みになった。自動生成スクリプトが無くなった。
 →自作のControllerに変更は可能。Config.groovyで指定するらしい

Ubuntu 12.04 へのドメイン名の反映

■さくら VPS設定
・ドメイン名登録
 コントロールパネル画面右上の「ネームサーバ登録」を選択。取得したドメイン名をテキストフィールドに入力して送信。
 そうすると自動でさくらのDNSに登録される。
 www. mail. などのサブドメインも登録してくれる。

・逆引き登録
 コントロールパネルの右「設定」から「ホスト名逆引き登録」を選択
 標準ホスト名にチェックが付いているが、カスタムに変更して取得したドメイン名を入力する

■Ubuntu設定
 12.04からresolverの設定方法が変更になったらしい。
 /etc/network/interfaces にresolver情報も記述する.

iface eth0 inet static
        address ****
        netmask ****
        network ****
        broadcast ****
        gateway ****
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers ****
        dns-search ****


という形に記述する。dns-nameservers にはさくらVPSのDNSサーバアドレスを記述
dns-search にはサーバが所属するドメインを複数記述する。
通常はhostname -f で取得できる結果と同じものを指定する。
単一のドメインに所属であれば、dns-domainを書けば良いらしい。
一応、さくら標準のホスト名でも検索できるように2つのドメインを指定

[番外編] Tomcat ログ出力

■Tomcatログ設定
ローテーションはtomcatでは行わない

設定 /usr/java/tomcat/conf/server.xml

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b"
               resolveHost="false" rotatable="false" />

■ログローテーション
 logrotate に任せる。

設定 /etc/logrotate.d/tomcat

/var/log/tomcat/*.out {
    copytruncate
    missingok
    notifempty
    compress
    rotate 8
    weekly
}

(意味)
copytruncate --- コピー元ログはローテーション後に切り詰める
missingok       --- ログが無くてもエラーにしない
notifempty     --- ログが空の場合はローテーションしない
compress      --- ローテーションファイルは圧縮
rotate 8        --- ローテーションは8回分保存
weekly          --- ローテーションは週1回実行