Nginx + Unicorn + Redmine

環境移設中にうまく動かなくなったので,追記.
ユーザの環境変数を引き継いでbundle exec ... は動くのに,crontab で @reboot から起こそうとすると,unicorn が上がらない場合,私の環境では次の2つが原因であった.

  • bundleコマンドを––user–localオプションつけてインストールしたから,rootからは見えなかった.
    ⇒フルパスで対応
  • bundlerを––user–localオプションつけてインストールしたから,bundle exec unicorn_railsの中でエラー吐いて動かなかった.
    sudo su - で完全にrootとしてログインして,gem install bundlerする.

これで解決したので,これ以上は調べてないよん.

途中.nginx から unicorn の呼び出しは設定完了済,設定ファイルは現行環境を見て,適宜,パースする(予定).

$cd tmp
$ wget http://www.redmine.org/releases/redmine-2.6.0.tar.gz
$ tar xzf redmine-2.6.0.tar.gz
$ mv redmine-2.6.0 ..
$ cd ~/redmine-2.6.0
$ sudo gem install bundler
$ vi database.yml
$ vi Gemfile.local
+ gem "unicorn"
$ bundle install --without development test rmagick postgresql sqlite
$ cp /oldfile/databasefile.sqlite3 ./db/
$ cp /oldfile/unicorn.rb ./config/
$ sudo bundle exec unicorn_rails -D -E production -c config/unicorn.rb # テスト
$ sudo kill (pid) # 停止

追記 2015/4/6
unicornまわりのコマンド系

起動
# bundle exec unicorn_rails -D -E production -c config/unicorn.rb

–D でデーモン化
–E hogehoge で hogehoge 環境を起動
–c hogehoge で hogehoge というファイルをコンフィグファイルに指定

停止
# kill -QUIT PID

unicorn.rb とかで pid ファイルを指定していると思うので,そいつを cat するか,ps aux | grep unicorn とかで探す.

再起動
# kill -HUP PID

完全にコンフィグとか読み直して欲しいんだけど,なんか反映されないことがあるので,その場合はQUIT→bundle execとする

新規に起動
# kill -USR2 PID

前のプロセスを残して起動.この後,QUIT すれば,サービスを止めずにプロセスを再起動できるという理屈だが,QUIT するのをよく忘れるので,あんま使ってない.

サブディレクトリで運用

アプリに依るんだろうけど,けっこう手間がかかるから,VirtualHost で運用できるなら,そっちのが楽.
redmineについては,そのうちまとめる.

SKK 導入 to ubuntu 14.04

for CLI
uim-fep を使う.
uim-fep と uim-skk をインストールして,uim-fep を起動すればいい.
for GUI
uim を使う.
上記に加えて uim を導入し,uim-pref-gtk で設定をした上で,再起動する.
for emacs
ddskk を使う.
上記とは無関係に,ddskk を導入し,emacs 上で C-x C-j として起動する.

追記
VM上のxmonadでCtrl+Spaceがそもそも登録できない時に,手で設定する場合.
~/.uim.d/custom/custom-global.scmの中で,

(define toggle-im-key '(" "))

英語ロケールの emacs -nw で tex の編集

追記
uim-fep と uim-skk を emacs -nw と共に使うと、漢字変換中の挙動により、インサートモードで編集している時に元の文書の一部を空白で置換してしまうという動作が見られたため、ddskk を使うことにした。
そうすると、emacs -nw にする必要はない。
追記ここまで

英語ロケールで emacs -nw を起動すると,yatex が args-out-of-range などと音を上げるので,それをなんとかする.

alias emacs-nox 'LC_ALL=ja_JP.UTF-8 emacs -nw'

とかなんとかやってみるといい.

なんで emacs -nw かといえば,emacs-nox ではなく emacs を入れているけど,uim-fep で skk を運用しているから,結局コンソールで emacs を起動したいという矛盾を抱えているから.

回線の死活監視

自宅の回線がよく切れるので,いい加減にムカついてきた.
とはいえ,どの程度切れているのかデータがないので計測することにする.

参考にしたのは,Perlでフラッシュする方法: 小粋空間

ただし,このままだと最後のperlの出力をファイルリダイレクトした時に,バッファリングされてしまう.
きっちりCtrl-dなんかで落とせばいいんだろうけど,うっかりCtrl-cで落とすと,バッファリングされている出力が電子の藻屑と化してしまう.
そこで,以下のように$|への代入でバッファリングを無効化するようコマンドを改造した.
あと細かいとこでいえば,24時間監視を1週間くらいしたく,200msでpingを打つと怒られそうなので,ちょっとパラメータもいじった.

$ ping hogehoge.destination.address -i 60 | perl -MPOSIX -ne "local $|=1;print strftime('%Y-%m-%d %H:%M:%S ',localtime), $_" > output.filename

ちなみに,多段のパイプやリダイレクトについては【bash】リダイレクトとパイプを理解する(3) - 私は素人サーバ管理者が参考になったものの,今回はそんな複雑なことにはならなかった.

ubuntu でバイナリを実行しようとすると no such file or directory が返る

ls では確かにファイルはあるのに,実行しようとすると no such file or directory が返ったら,バイナリがどのアーキテクチャ (ARCH と言うらしい) を想定しているかを確かめるのが良いらしい.
参考:Man page of ARCH
で,要は x64 環境で x86 用のバイナリを走らせようとすると,no such file or directory が返るので,アーキテクチャをチェックしろということ.

$ file binaryfile

これでチェックすれば良い.

参考にした記事:Ubuntu日本語フォーラム / PandaBoard上のUbuntu12.04で実行ファイル実行時に、No such file or directory

linux サーバをいくつも越えて

直接接続できないリモートホストにsshとかscpとかする話.
基本的には,SSH力をつけよう - SlideShare なんだけど,いくつかできない点があったのでメモ.

ログインできないけど socks proxy として動作する linux を通過

Host HOSTA
    User         [A_USER]
    HostName     [A_HOST_FROM_SOCKSHOST]
    Port         [A_PORT]
    ProxyCommand nc -x [SOCKSHOST]:[SOCKSPORT] %h %p

ブラケット内を変更する.A_* は A の,って意味.FROM_* は,* から見て,という意味.
netcat は netcat-traditional では -x オプションが使えないので,netcat-openbsd にしないとだめポ

socks でアクセスできる host からなら届く linux

Host HOSTB
    User         [B_USER]
    HostName     [B_HOST_FROM_A]
    Port         [B_PORT_FROM_A]
    ProxyCommand ssh -W %h:%p HOSTA

多分,nc でも同じことできるけど,ssh のオプションでトンネル.

これを Windows (WinSCP) でやる

socks の設定は「プロキシ」へ,踏み台の設定は「トンネル」へ.
多分,putty も似たような設定すればいいけど,私の環境だと wakeonlan とかの関係で一度 HOSTA に入るので,そんな設定は使うことがなく,よく知らない.

Rlogin という名前の ssh クライアント

作者のページはここ → rlogin/telnet/ssh(クライアント)ターミナルソフト
タブ型sshクライアントとして使っていて,画面分割してターミナルを表示できるのが便利かなと思って入れてみた.
結局,接続先が1つの場合は使い勝手がtmux には及ばず,かつ tmux のコマンドが使用不能となってしまったため,使用を断念した.

不満点

  • tmux ではペーンの移動を上下左右に自由にできるが,Rlogin では順に送ることしかできない
  • 送りコマンドもTabや↑を要するなど,アルファベットキーの範囲内で操作できない
  • 窓内で tmux を使おうにも,窓のサイズ変更に割り当てている Ctrl-t,Ctrl-h のコンビネーションが効かない

puttyのいけてないところは,公開鍵が独自フォーマットなところなのだが,設定の手間さえかければ,それ以降は気にせず使えるので,どちらかというと putty に軍配があがった.

debian でファームウェアインストール

-- 追記(8/27)
やっぱ直ってなかった。

症状

  • sshしてると10秒~5分の間で、なんかセッションが切断される。
  • 切断された時は、新しくsshのセッションを開こうとしても接続に失敗する。
  • winscpを使っている分には、切断を挟んでいても気付かない。
  • サーバ側のログにはクライアントがタイムアウトしたと出ている。
  • クライアント側では、「Network Error: Software caused connection abort」とログが出る。
    (↑このエラーは、Windowsが吐く一般的なNWエラーらしく、あんまり手掛かりにならなさそう?)
    参照:10.14 ‘Network error: Software caused connection abort’
  • ブログアクセスなど負荷のかかる動作をさせると高確率で切れる。

やったこと

直感的に、ログ出力の変更とか関係ない気もするが、不思議とmysqlのログを追加することでblogアクセスによる切断が生じなくなったので、因果はともかくとしてメモっておく。

  • とにかく/var/logに出ているエラーを消す。
    • bind9のv6を動作させなくする。
      /etc/bind/named.conf.optionslisten-on-v6 {none;}; では不十分で、/etc/default/bind9 を書き換え。

      - OPTIONS="-u bind"
      + OPTIONS="-u bind -4"
      
    • sambaのprinter_cups関連の設定を無効化。
      + load printers = no
      + printing = bsd
      + printcap name = /dev/null
      

      どれが欠けてもエラーは継続。

  • sshまわりの設定修正
    • sshdの設定を多少変更 (ClientAliveInterval を少し伸ばした)
    • sshクライアントからkeepaliveを発出
    • ログを単独出力
      - SyslogFacility AUTH
      + SyslogFacility LOCAL5
      
      - auth,authpriv.*;(hogehoge)                      /var/log/auth.log
      + auth,authpriv.*;(hogehoge);local5.*             /var/log/auth.log
      + local5.*                                        /var/log/sshd.log
      
  • mysqlまわりの設定修正
    • slowlog の出力

-- 追記ここまで

自宅の debian マシンのネットワーク接続が、突然不安定になった。
syslog や、他のログを見ていても原因はよく分からなかったが、dmesg などで NIC の firmware が見付からないというエラーが出ていた。
r8169 0000:03:00.0: firmware: agent aborted loading rtl_nic/rtl8168e-2.fw (not found?)
みたいな感じ。

ファームウェアの名前からベンダを調べて、上記の場合は Realtek なので、

# aptitude search firmware # ← firmware のパッケージを探す
# aptitude install firmware-realtek

と単純に実行するだけで、なんとなく解決したっぽいので良しとする。

netcat-traditional

Debian wheezy を入れて,Proxy 越しに ssh をしようとしたら,それまでの .ssh/config では通らなかった.

nc: invalid option -- 'x'
nc -h for help
ssh_exchange_identification: Connection closed by remote host

理由は,netcat-traditional というパッケージが入っていて,nc コマンドに proxy を指定する -x オプションがないから.
netcat-openbsd とかを入れればOK

ubuntu とか centos で resolv.conf が勝手に書き換えられるのを止める

最近は linux を使っていても PC 起動のタイミングで resolv.conf が勝手に書き換えられるようになってしまった。
普通にインストールすると /etc/resolv.conf は symlink なのだが、通常ファイルに置き換えてもダメ。
昔は dhclient.conf の書き換えで直っていたのだが、最近はそれも効かなくなり苦労していた。

[ Fedora ] resolv.conf が勝手に書き換えられていた - NetworkManager を無効にする: Fomalhaut of Piscis Australis
がドンピシャの記事だったので、メモる。
CentOS の場合は載っているが、一応転載しつつ、ubuntu の場合も書いておく。

CentOS の場合: # yum erase NetworkManager
ubuntu の場合: # apt-get purge network-manager

注意
このままだと、resolv.conf も interfaces も設定しなければならないので、この状態で遠隔操作のままリブートしないこと!!
interfaces は最近、編集する機会が減り、検索結果にも出にくくなってきた気がする。
eth0 inet static とかで検索したら出るよ。

なお、 ubuntu だと記事の CentOS のように network-manager-pptp とか関連っぽいものは消えてくれなかった。
記事では erase を使っている辺りに憎しみを感じるが、大変よく分かります。