0

nginxでホームディレクトリを表示する設定

研究室のMacがwebサーバーになってて、今まではapacheを使ってたんだけどnginx使うようにしたらホームディレクトリが表示できなかったので、nginxの設定書いた。
既に各自のホームディレクトリにあるファイルにwiki等からリンクが貼られているので、切れると面倒

このへん参考にした HttpCoreModule

今までは /Users/sho/Sites/test.html が
http://masui.sfc.keio.ac.jp/~sho/test.html
で見えていたので、そのようにしたい。

locationを書いた

server {
listen 80;
server_name localhost;
server_name "masui.sfc.keio.ac.jp";
server_name "~^masuilab\.(org|net|com)$";
charset utf-8;
root /Volumes/share/Web;
autoindex on;
location / {
index index.html index.htm;
}
location ~ /~([a-zA-Z0-9_\-]+)(.*)$ { ## ホームディレクトリの設定
alias /Users/$1/Sites$2;
index index.html index.htm;
}
## 略
}

ついでに http://sho.masuilab.org/test.html でも見れるようにした
server {
listen 80;
charset utf-8;
server_name "~^(?<user>[a-zA-Z0-9_\-]+)\.masuilab\.(.+)$";
root /Users/$user/Sites;
autoindex on;
location / {
index index.html index.htm;
}
}

0

Apache+Passengerでenvironmentの設定

いままでsinatra使う時にconfig.ruに

set :environemt, :production
とか
set :environemt, :development
って書いてたんだけど、httpd.confに
RackBaseURI /app_path
RackEnv production
って書けばいいのだった。

1

apache2のサブディレクトリをthinで起動してるsinatraにプロキシする

SinatraやRailsは開発は楽だけどデプロイ方法がいろいろあって悩む。
最近はpassengerを使う方法が流行ってるけど、あいにく学校に置いたサーバーでサブドメインが使えないので同一ホスト名でapacheと共存させるしかない。

passengerでもRailsBaseURIだったか?を設定すればサブディレクトリでRack対応アプリを動かせるが、
今回は1年前からRails+mongrelのデプロイに使っているapache2のサブディレクトリをmongrelで起動してるrailsにプロキシする – 橋本詳解と同じ方法でSinatra+Thinをデプロイした。
Railsではmongrel_clusterで複数起動させたrailsにapache2のmod_proxy_balancerでアクセスを割り振ったが、同じ設定でsinatra+thinにも割り振れる。

結果、橋本商会 Twitterの地名なうbotを全blockするOAuthアプリで作ったアプリのURLをport番号むきだし状態から http://shokai.mag.keio.ac.jp/block_nowbots/ という良いURLに変更できた。ちゃんと他のrailsアプリとも共存できてる
今は10個起動したthinにapacheがアクセスを割り振っている。


■thinでsinatraを動かす
まず単純にthinを1プロセスだけ起動してsinatraが動くかどうかチェックしておく

sudo gem install thin

起動にはアプリ本体と、config.ruが必要

main.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra'
require 'rack'

get '/' do
end
thinから起動するためにrackをrequireしておく。


config.ru
require 'rubygems'
require 'sinatra'

require 'main.rb'
run Sinatra::Application


logやpid、静的ファイルを置く場所を作る
mkdir log
mkdir public
mkdir tmp
mkdir tmp/pids


まず普通に起動させてみる。とくにpublicやtmpディレクトリの位置を指定する必要ない。ディレクトリがあればそれぞれの機能は有効化されるし無くても特にエラーは出ないみたい
thin start -R config.ru
ctrl+Cで終了。



■apache2のmod_proxy_balancerでアクセスをthinに振り分ける

mod_proxy有効化
sudo a2enmod proxy_balancer 
sudo a2enmod proxy
sudo a2enmod proxy_http


/etc/apache2/mods-available/proxy.conf
<IfModule mod_proxy.c>
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

</IfModule>


/etc/apache2/conf.d/your-app-name.conf
ProxyPreserveHost Off
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /appname balancer://appname
ProxyPassReverse /appname balancer://appname

<Proxy balancer://appname>
BalancerMember http://127.0.0.1:4040 loadfactor=10
BalancerMember http://127.0.0.1:4041 loadfactor=10
BalancerMember http://127.0.0.1:4042 loadfactor=10
BalancerMember http://127.0.0.1:4043 loadfactor=10
BalancerMember http://127.0.0.1:4044 loadfactor=10
BalancerMember http://127.0.0.1:4045 loadfactor=10
BalancerMember http://127.0.0.1:4046 loadfactor=10
BalancerMember http://127.0.0.1:4047 loadfactor=10
BalancerMember http://127.0.0.1:4048 loadfactor=10
BalancerMember http://127.0.0.1:4049 loadfactor=10
</Proxy>
こうすると
http://hostname:4040/ から http://hostname:4049/までで動いているsinatraアプリが、
http://hostname/appname/ として外からは見えるようになる。

apache2再起動
sudo /etc/init.d/apache2 restart

今後は新しいアプリを作る毎にこの your-app-name.conf を雛形にして conf.d の中に配置してapache2再起動するだけでいい。




■thinを複数起動させる
thin+sinatraを複数起動させて管理しやすくする設定ファイルを作り、mongrel_clusterみたいにする。
main.rb, config.ruと同じディレクトリにthin.ymlを置く

thin.yml
timeout: 30
log: log/thin.log
environment: production
servers: 10
daemonize: true
rackup: config.ru
port: 4040


起動
thin start -C thin.yml
これでport 4040から10(つまり4049まで)まとめてdaemonとして起動する。

停止、再起動コマンドもある。
thin stop -C thin.yml
thin restart -C thin.yml



最終的なファイルの配置こうなる。 *.logと*.pidはthinが自動生成したもの。jsや画像はpublicの下に置く。
|-- config.ru
|-- log
| |-- thin.4040.log
| |-- thin.4041.log
| |-- thin.4042.log
| |-- thin.4043.log
| |-- thin.4044.log
| |-- thin.4045.log
| |-- thin.4046.log
| |-- thin.4047.log
| |-- thin.4048.log
| `-- thin.4049.log
|-- main.rb
|-- public
| `-- shokai.jpg
|-- thin.yml
`-- tmp
`-- pids
|-- thin.4040.pid
|-- thin.4041.pid
|-- thin.4042.pid
|-- thin.4043.pid
|-- thin.4044.pid
|-- thin.4045.pid
|-- thin.4046.pid
|-- thin.4047.pid
|-- thin.4048.pid
`-- thin.4049.pid

0

SFCからさくらへ、Feedのリダイレクト

今回はあいにくMTからwordpressへの移行だったので、個別エントリのURLは変わってしまったけど

livedoor Reader 開発日誌 : フィードのリダイレクト処理について – livedoor Blog(ブログ)

にあるように、HTTPコード301で移転ステータスを出せばフィードを登録しなおしてくれるRSSリーダもあるらしい。

SFCのCNSにpublic_html/.htaccessを置いた。

Redirect 301 /~shokai/atom.xml http://shokai.org/blog/feed/

Redirect 301 /~shokai/index.xml http://shokai.org/blog/feed/

Redirect 301 /~shokai/index.rdf http://shokai.org/blog/feed/

Redirect 301 /~shokai/archive/ http://shokai.org/archive/

Redirect 301 /~shokai/index.html http://shokai.org/blog/


フィードを全部リダイレクトして、トップページもリダイレクトした。index.htmlを指定すると~shokai/でアクセスした場合もちゃんとリダイレクトしてくれる。

個別記事はURL変わってるから全てリダイレクトすると404になってしまう。これはdel.icio.usとかから個別記事に飛んできて読む人(俺とか)が不便になるので、移転しない事にした。

あと.htaccessを置いた場所からの相対パスじゃなくて、ドメインのルートからのパスだという事にひっかかった。

ちゃんとできてるかの確認はweb-snifferが便利だった。

こうすると全部移転できる。

Redirect permanent /~shokai/ http://shokai.org/blog/