カテゴリー別アーカイブ: Apache httpd

NginxでWordPressを動かす@Ubuntu 14.04 LTS

少し流行は過ぎてしまったのですが、UbuntuのnginxでWordPressを動かしたのでメモ。

1. 構成
まずは構成について。
ウェブサーバの構成について、単にnginxを使うとしてもいろいろな構成があるんだけれど、今回はリバースプロキシを使った構成にしました。

リバースプロキシはユーザからのリクエストを受ける際、いったんプロキシサーバがリクエストを受け取って、それを本当のウェブサーバに問い合わせを行う、というそんな機能を提供してくれます。
プロキシ(代理)サーバなので、リクエストを途中から代理してくれる、そんなサーバです。
リバースと付いているのは、リバースじゃ無い普通のプロキシサーバもありまして、こちらはクライアント側で利用します。リバースプロキシはリバース、逆向きなので、サーバ側において代理させるんですね。
ちなみにリバースプロキシサーバ、プロキシサーバともにキャッシュ機能が付いている物がほとんどです。

で、今回の構成では、インターネット側からのリクエストをnginxのリバースプロキシで受けて、それを内部のnginxへリクエスト、そのnginxはWordPressに必要なPHPをPHP-FPMというものを使って動作する、ということに。
このリバースプロキシを使うことでキャッシングが容易にできるのでWordPressの高速化が進む、というものですね。

ちなみにPHP-FPMはプロセスで待ち受けさせていて、リクエストがあるとすぐにPHPを実行して結果を返すという、そういう仕組みをもったPHPのサーバ、デーモンです。

一台のサーバで”リバースプロキシ”、”ウェブサーバ”、”PHPサーバ(アプリケーションサーバ)”を動かす必要があるので、そのやりとりにはいくつかのルールが必要です。
サーバへリクエストを投げるときには必ず、どのサービスへ繋ぐか、という情報が必要なのですが、これを通常ポート番号によって振り分けるのです。
ちなみに一般的なウェブサービスだと80番を利用します。またプロキシサーバでは8080版を利用します。

今回はリバースプロキシですのでこいつが80番で待ち受けて、このリバースプロキシからウェブサーバへはウェブサーバの8080番ポートへ接続、PHPが動いているデーモンへはポート番号じゃなくてsockという仕組みで繋ぐことにしました。

2. 手順
まずはインストール。ubuntuなのでaptを利用します。今回必要になるのはnginx, php-fpmです。

shell> sudo apt-install nginx php-fpm
shell> cd /etc/nginx

インストールが終わったらnginxのデフォルトコンフィグが格納されている/etc/nginxで作業します。

まずは早速、WordPressに必要なnginxのconfigを二つ書きます。
これはWordPressの公式サイトで紹介されています。二つのconfを/etc/nginx/siteconf.d/というディレクトリを作って配置しています。

more /etc/nginx/siteconf.d/global_restrictions.conf       
# this file is from http://codex.wordpress.org/Nginx                            # Global restrictions configuration file.                                       
# Designed to be included in any server {} block.</p>                           
location = /favicon.ico {                                                       
         log_not_found off;                                                     
         access_log off;
}

location = /robots.txt {
         allow all;
         log_not_found off;
         access_log off;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Sto
re (Mac).
# Keep logging the requests to parse later (or to pass to firewall utilities suc
h as fail2ban)
location ~ /\. {
         deny all;
}






shell> cat /etc/nginx/siteconf.d/wordpress_base
# this file is from http://codex.wordpress.org/Nginx

# WordPress single blog rules.
# Designed to be included in any server {} block.

# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
         try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       access_log off; log_not_found off; expires max;
}

# Uncomment one of the lines below for the appropriate caching plugin (if used).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {
         # Zero-day exploit defense.
         # http://forum.nginx.org/read.php?2,88845,page=3
         # Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi.
         # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine.  And then cross your fingers that you won't get hacked.
         try_files $uri =404;

         fastcgi_split_path_info ^(.+\.php)(/.+)$;
         #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

         include fastcgi_params;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param REMOTE_ADDR  $http_x_real_ip;
#        fastcgi_intercept_errors on;
         fastcgi_pass unix:/var/run/php5-fpm.sock;
}

最初のglobal_restrictions.confでは不正なアクセスを防ぐための設定です。nginxでは.htaccessを初めとしたファイルを利用しませんので、それらのファイルが標準では直接表示されたりします。中にはパスワードを書いてあったりすることもあるので安全のためこれらのファイルを非表示にするconfです。

続いてwordpress_base.confです。これがnginxとphp-fpmでwordpressを動かすための基本的なconfigになります。ほとんどは公式通りなのですが、注意点がいくつかあります。
conf本体の下部にある、 “fastcgi_param REMOTE_ADDR $http_x_real_ip;”については追記してあります。
これは今回リバースプロキシを使うに当たって、ウェブサーバで見えるクライアントIPアドレスが127.0.0.1のような自分自身のアドレスになってしまうことを防ぐ処置です。
自分自身をリバースプロキシにする場合に限らず何らかのリバースプロキシを挟むとREMOTE_ADDRが書き換わってしまいます。そうするとアクセス解析やコメントをつけた人のIPアドレスがすべて同じものになってしまい意味のないものになってしまいます。
それを防ぐための構文になります。ちなみにapacheであればmod_rpafというモジュールで対処したりします。
もう一点気をつける構文は”fastcgi_pass unix:/var/run/php5-fpm.sock;”です。今回はPHPとnginxを動かすサーバが同じサーバでしたのでsockを利用しました。他のホストで動かす場合やTCP/IPで動かす場合には変更が必要です。

これでwordppressの基本的なconfは揃いました。続いてはサイトのconfを書きます。

最近はnginxもapache同様、ドメインごとにconfigを書いてシンボリックリンクで有効化/無効化する流れになっています。今回は /etc/nginx/sites-available/example.com で作成しました。
このconfにはリバースプロキシ用の設定も含まれるので少し大変です。

shell> cat /etc/nginx/sites-available/exampel.com.conf
server {
        listen 80;
        server_name www.example.com;
        root        /home/yousan/public_html/www.example.com;
        index index.html index.htm index.php;
        include siteconf.d/global_restrictions.conf;

# ここから下がリバースプロキシ用の設定 最後にドメインの名前を設定すること
# またnginx.confのbackednともセットで設定すること
              location /wp-admin { proxy_pass http://backend; }
              location ~ .*\.php { proxy_pass http://backend; }
        location / {
              set $mobile "";
              if ($http_user_agent ~* '(DoCoMo|J-PHONE|Vodafone|MOT-|UP\.Browser|DDI
POCKET|ASTEL|PDXGW|Palmscape|Xiino|sharp pda browser|Windows CE|L-mode|WILLCOM|SoftB
ank|Semulator|Vemulator|J-EMULATOR|emobile|mixi-mobile-converter)') {
              set $mobile "@ktai";
              }
              if ($http_user_agent ~* '(iPhone|iPod|Opera Mini|Android.*Mobile|NetFr
ont|PSP|BlackBerry)') {
              set $mobile "@mobile";
              }
              if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-post
pass_" ) {
              set $do_not_cache 1;
              }
              proxy_no_cache     $do_not_cache;
              proxy_cache_bypass $do_not_cache;
              proxy_cache czone;
              proxy_cache_key "$scheme://$host$request_uri$is_args$args$mobile";
              proxy_cache_valid  200 301 302 60m;
              proxy_cache_valid  404 5m;
              proxy_cache_use_stale  error timeout invalid_header updating http_500
http_502 http_503 http_504;
              proxy_pass http://backend;
              proxy_redirect http://www.example.com:8080/ /;
       }
}

server {
    listen      8080;
    server_name www.example.com;
    index index.html index.htm index.php;
    include siteconf.d/global_restrictions.conf;
    include siteconf.d/wordpress_base.conf;
    root            /home/yousan/public_html/www.examplecom.com;
}

shell> sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled

このconfでは上のserverディレクティブで80番の待ち受け、リバースプロキシ側の待ち受けを設定します。この中で最後の方にあるproxy_redirectという構文で実際にPHP等が動いている8080で待ち受けをしているウェブサーバへ転送しています。
下の8080で待ち受けをしているところは先ほどwordpress用のconfを書きましたのでそれらをincludeして、あとは少し書いてやるだけでOKです。

ドメインごとのconfを書いたらlnでシンボリックリンクをsites-availableへ移してあげてください。こうすることで有効化されます。

最後にnginx本体のconfを書きます。
今回はリバースプロキシでレスポンスを早くしよう!というが目的ですのでリバースプロキシのキャッシュとgzip圧縮を有効化します。
ココでもリバースプロキシ用の設定を分けてあります。
機能別に分けられたconfはconf.dに入れると自動で読み込まれますのでそちらに入れておきます。自動に読まれますけれど*.confという名前じゃないとダメなので注意してください。

shell> cat /etc/nginx/conf.d/
proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:4m max_size=50m inacti
ve=120m;
proxy_temp_path   /var/tmp/nginx;
proxy_cache_key   "$scheme://$host$request_uri";
proxy_set_header  Host               $host;
proxy_set_header  X-Real-IP          $remote_addr;
proxy_set_header  X-Forwarded-Host   $host;
proxy_set_header  X-Forwarded-Server $host;
proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;
proxy_set_header  Remote-Addr        $remote_addr;
#real_ip_header X-Forwarded-For;
#real_ip_recursive on;

upstream backend {
             ip_hash;
             server 127.0.0.1:8080;
}

こちらが本体側のconfです。ほとんど書き換えてないのでコメントを外すだけですね。

shell> cat /etc/nginx/nginx.conf
... 省略 ...
       ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/x-javascript tex
t/xml application/xml application/xml+rss text/javascript;

これでconfが整いました。
最後にnginxを再起動して動作確認です。

shell> sudo service nginx restart

さて、動いたでしょうか。

今回自分もすぐには動かず、いくつかはまった点がありましたので紹介しておきます。
1. 文末のセミコロン忘れ
2. www.example.comというドメインのまま、ドメイン名を書き換え忘れていた
nginxではほとんどの文末にセミコロンをつける習慣がありますので、これを忘れるとエラーになります。
ドメイン名の書き換えでは色んなサイトを参考にしながらconfを書いたのですが、confの途中にドメイン名がでていて、今回実際に運用するドメインに書き換えるのを忘れていて動きませんでした。

これらのエラーについてはerror.logを見る事でどのファイルのどこでエラーが起きている、ということが分かったりします。

shell> sudo tail /var/log/nginx/error.log

ただ中には直接的にエラーが表示されず、推測に推測を重ねてエラーを取り除く必要もありますがそちらについては…、経験が物をいいますね!

以上となります。

apacheのvirtualhostの設定でservernameが一致しなかったときの挙動

apacheのvirtualhostの設定でservernameが一致しなかったときの挙動について思った通りの挙動ではなかったので修正した。

apacheのコンフィグファイルの中にホスト名ごとにDocumentRootなどを変えるvirtual hostの機能がある。これはとても便利なんだけれど、思った通りの挙動ではなかったので調べてみた。

FreeBSDではportsからapacheをインストールするとそのコンフィグファイルは /usr/local/etc/apache22に置かれる。

その中の extra/httpd-vhosts.conf にvirtualhostの設定が書いてある。デフォルトコンフィグがあるのでそれを参照しながら書いたりしてる。これを使うとホスト名での環境の変更、ポート番号ごとによる変更などが可能になる。
virtualhostは参照されたホスト名によってコンフィグを切り替えるので、アクセスされたホスト名を示す ServerName によって切り分ける。
具体的には下記の例。

<VirtualHost *:80>
DocumentRoot /usr/local/www/www1.example.com
ServerName www1.example.com
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /usr/local/www/www2.example.com
ServerName www2.example.com
</VirtualHost>

この設定であればwww1.example.comなホスト名でアクセスすると /usr/local/www/www1.example.com のファイルが参照される。
www2.example.com でアクセスすれば /usr/local/www/www1.example.com が参照される。
ここで www3.example.com でアクセスされるとこのコンフィグには設定が存在しない。
この設定の上位には元を設定するための httpd.conf があって、そちらの設定が適用されるのかと思ってた。だけどどうやら違うらしく、httpd-vhosts.conf の最上部が適用されるらしい。
つまりこの例であれば /usr/local/www/www1.example.com が表示されるということに。
これだと思ってたより違う感じで困ってしまうので、そのような場合のためにServerNameが一致しないときのDcoumentRootを設定しておく。
設定のやりかたは簡単でServerNameを記述しないディレクティブを一つ置いておけば良い。

# servernameが一致しなかった時用
<VirtualHost *:80>
DocumentRoot /usr/local/www/apache22/data
</VirtualHost>

これでServerNameが合わなかった時の設定に合致するので変なホスト名の設定がひょじされることはなくなった。

めでたしめでたし。

apache httpdでldapを用いてbasic認証を行うときにユーザとかを制限する

apacheで.htaccessを用いてbasic認証を行うとき、認証可能なユーザを選べるようにしてみた。

AuthzLDAPAuthoritative off
AuthName "ldap ninshou dayoyo"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPURL ldaps://192.168.1.1/ou=People,dc=l2tp,dc=org?uid
Require ldap-user user1 user2
#Require ldap-filter !(cn=except_user)

この設定を行う上で、 ldap-filterを選択した場合、フィルターをクォートしてしまうとうまくうごかなかった。

http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html#requiredirectives

ApacheのBasic認証にLDAPを利用する

apacheのBasic認証にLDAPを利用しようとしてみた。

サーバはOpenLdap24 on FreeBSD, クライアントはApache22 on CentOS6.2。

今回の方法はBasic認証でアクセス制御をしたい箇所に.htaccessを設置してみた。

shell> more .htaccess

AuthzLDAPAuthoritative off
AuthName "ldap ninshou dayoyo"
AuthType Basic
AuthBasicProvider ldap
#LDAPVerifyServerCert off
AuthLDAPURL ldaps://192.168.1.1/ou=People,dc=example,dc=com?uid
Require valid-user

コレだとうまくいかない。500のInernal Server Errorが帰ってしまう。ユーザ名とパスワードの組み合わせがうまくいかないのかと思いきや、他の手段で認証を試すとうまく通ってる。

apacheのerror_logをdebugレベルまで引き上げてログを見てみた。

shell> more httd-vhosts.conf

…前略…

# ldaptest
<VirtualHost *:80>
ServerAdmin hogetan<a href="mailto:[email protected]">@l2tp.org</a>
DocumentRoot /home/hogetan/public_ldap
ServerName ldap.l2tp.org
LogLevel debug
ErrorLog /var/log/httpd/ldap.l2tp.org-error.log
CustomLog /var/log/httpd/ldap.l2tp.org-access.log combined
</VirtualHost>

…後略…

shell> tail /var/log/httpd/ldap.l2tp.org-error.log

[Tue Feb 28 09:43:23 2012] [debug] mod_authnz_ldap.c(393): [client 192.168.1.5] [29473] auth_ldap authenticate: using URL <a href="ldaps://192.168.1.1/ou=People,dc=hoge,dc=info?uid">ldaps://192.168.1.1/ou=People,dc=hoge,dc=info?uid</a>
[Tue Feb 28 09:43:23 2012] [info] [client 192.168.1.5] [29473] auth_ldap authenticate: user yubird authentication failed; URI /favicon.ico [LDAP: ldap_simple_bind_s() failed][Can't contact LDAP server]
[Tue Feb 28 09:43:23 2012] [debug] mod_authnz_ldap.c(1105): [29467] auth_ldap url parse: `ldaps://192.168.1.1/ou=People,dc=l2tp,dc=org?uid', Host: 192.168.1.1, Port: 636, DN: ou=People,dc=l2tp,dc=org, attrib: uid, scope: base, filter: (null), connection mode: using SSL

なんかエラー出てる。Can’t contact LDAP serverとか言われてる。

いろいろ悩んで湯バード先生にヘルプを求めた結果、ldapsのsがいけないんじゃ無いか、ってことに。sslの証明書の検証が悪いのではないか、ということだ。今回のldapサーバはオレオレ証明書を利用しており、今までもldap.confなどでことごとく証明書の認証でコケた経験があった。

試しにldapsじゃない、ldapな待ち受けに接続にいくとすんなりつながった。

で、証明書の検証をしないようにするオプションを探して有効にしてみた。

http://httpd.apache.org/docs/2.2/mod/mod_ldap.html#ldapverifyservercert

このオプションで注意しなくてはいけないのは、.htaccessなどには記述できない、ということ。virtualhostディレクティブとかでもダメ、グローバルディレクティブじゃないとダメっぽい。

shell> grep LDAPVerify httpd.conf

LDAPVerifyServerCert Off

この設定を入れたらldapsでもうまくいった。

とにかくldaps+オレオレ証明書の場合には証明書の検証問題に注意しろ、ってことで。めでたしめでたし。

ApacheでBasic認証のバックエンドにLDAPを使ってみた

意外と簡単。
requireで ユーザのgidNumberが1000 OR 100で、valid-userならログインできる設定にしてみた。require ldap-filterにはldapsearchのフィルター書式がそのまま使えるっぽい。

  <DirectoryMatch "/(path1|path2|path3)">
    AuthType Basic
    AuthName "Private"
    AuthBasicProvider ldap
    AuthzLDAPAuthoritative off 
    AuthLDAPURL ldap://ldap.example.com/ou=people,dc=example,dc=com?uid
    Satisfy all 
    require ldap-filter "|(gidNumber=1000)(gidNumber=100)"
    require valid-user
  </DirectoryMatch>

phpMyAdminをインストール

1. phpMyAdminをインストール

最近の鯖の移転に合わせてphpMyAdminも移動することになった。

まずは対象のホストでphpMyAdminをインストールする。ホストはFreeBSDなのでportsを利用する。

shell> portinstall –c databases/phpmyadmin
shell> pkg_info -Ix phpMyAdmin
phpMyAdmin-3.4.7    A set of PHP-scripts to manage MySQL over the web

今回のインストールはapacheもphpも入ってなかったのでコレに合わせてインストールされた。

途中のコンパイルオプションでmod_phpを作成するのを忘れないように。

また、mysqliモジュールも必要だったり。

続きを読む phpMyAdminをインストール

webサーバ勉強会

webサーバ勉強会#2に参加しています。
2010-12-12 Webサーバ勉強会#2 まとめ
apache周りとのことでどの発表も楽しかったのですが、個人的にはsmallpalaceさんのnfs周りの話がお題とは違った趣旨の中で気になったりしてました。自分のところのサーバセグメントが全部一つのnfsを参照するようになっているため、今後はもっとチューニングが必要になるはずでしょう。過去に何度か、topしたらnfs周りのステートが表示された状態でプロセスが出まくって問題になったことがあります。スライドが公開されたら確認しておかねば、ねばねば。


まずは主催者@oranieさんの発表。

  • prefork利用時のチューニングについて。
  • 基本的な設定値の説明や、マシン本来の力を超えては性能を引き出せないことについて。
  • 逆にメモリリソースなどがあまっているのは本来の力を出し切っていないということ。
  • abでプロセスを暖めるような感じで、1プロセスあたりのメモリ使用量を見てみる実演。
  • かりかりチューニングするといざというときに余裕がなくて困りますよ

次は@kuwa_twさん。”チューニングで逃げる”

  • 必要のないモジュールは削除(DSOとかあるけど作り直しましょう) -> DSOってなぁに <- 動的共有オブジェクト <- .koをkldloadするようなものらしい。
  • MPMの設定は適切に。
  • 実際に利用する際には、プロセスの生成にはコストがかかるのであまりプロセスが立たないようにしてあげましょう。
  • maxclientsが1000なら
    startservers = 10 , threads per child = 100ならかけ算して1000になる。minもmaxも1000
  • keepaliveについて。
  • maxkeepaliverequestsを100にしてみると、keepalivetimeoutは短めに。10とか。これ長めにしてしまうとサービスいっぱい喰われてしまう。
  • kuwa_twさんが好きなのは1 < keepAliveTimeout
  • 1だからといってoffにするとコストがかかってしまうよ。
  • maxKeepAliveRequestは1ページあたりのコネクションより少し少なめに。
  • ETagについて。ETagはファイルの情報を元に作成してるので、LoadBalance使ってる場合には絶対にinodeで判断したらだめだよ。
  • MTimeとSizeでやってやるといいよ。 < nfsだとどうなんだろう
  • FileETagのオプションで、
  • FileETag -INode Mtimeってやってもうまくいかなくて、
  • FileETag All -INode Mtimeってやるといいらしです。 <- -(マイナス)オプションはAllから引いてやるってやらないと効かないよ
  • サーバ構成について。静的ファイルと動的ファイルは鯖を分けましょう。
  • 動的ファイルを静的ファイルにしよう <- wget + mod_rewriteで

@soestudioさんによるmod_pagespeedについて

  • 標準状態にmod_pagespeedを組み込んでみると、遅くなった!
  • どうやらmd_pagespeedって手動で設定しなくちゃいけないcssの外部化とかを自動でやってくれるものらしい。
  • JMeterで負荷をかけてみる。 < 耳にしてたけど負荷かけツールなんだ!
  • なんかHTMLの構文エラーみたいなログがいっぱいでるよ!
  • これ構文チェックとかcssの参考とかに使えそうなmodだね

@shin3さんによるSSLチューニング。SSLの設定とかSSL/TLSについて理解しよう!

  • chromeとfirefoxは一緒の暗号化ライブラリをつかってる
  • operaは認証をするcipher suiteの一覧を設定できるよ!
  • 2010年から1024ビットじゃなくて2048ビットの証明書を使いましょう! – 2010年問題
  • linuxだとeth0:1とか書けば仮想nicがいけるらしい。最近のは進んでるなぁ。1ホストでnat+pppoeとかできちゃうんじゃないかな。
  • xperはsniが使えない
  • 証明書のcn(common name)にはwilde cardがつかえるよ!携帯でもつかえるよ! *.example.comとか
  • sslは SSL Session Cacheを使うといいよ! SSLセションの再利用ができるよ!
  • shared memoryをcycricにバッファするshmcb, shm hash table な shmht, DataBase Management,   mcはmemcache
  • 公開鍵暗号の科技庁が長くなると暗号化とか複合化に時間かかります。
  • 脅威を正しく評価し、適当な強度のアルゴリズムを選択する。
  • SSLを使うのであればSSLアクセラレータを使うと早くなるよ。
  • IPアドレスベースの仮想ホストをたてるといろいろな面でSSLのことが便利だよ!
  • opensslは結構地雷原。

自分の発表。

  • ログの管理は大変だよ、ログサーバ作ろうよ。
  • 意外にもファイルI/Oってcpuもってかれたりするから注意
  • LinuxはLVMだね! -> freebsdならzfs使わないとかな!
  • logはとってたりとってなかったり(するところがあるらしいよ!)。あとからログ出せやって言われたりするので個別にホストごとにファイルをまとめて圧縮とか切り出しとかして保管。
  • →5年は保管って決められてたりするよね。海外にサーバ置いてしまえば気にしなくて良かったりするよね。


@smallpalaceさんのwebサーバのチューニングについて。

  • traceenable off <- この設定はなんだろう <- なんかセキュリティ的にオフにしようってのがちらほら、dtraceとかではないらしい。
  • その他いろいろと数字の変更点など。スライドがどこかにあるかな、あれば後でちゃんと見ておこう。
  • ログサーバは受け側で負荷がかかるのでtcpのチューニングしてるよ!
  • mod_cacheとかmod_mem_cacheとか。mod_mem_cacheは早くなるらしい。
  • mod_disk_cacheを利用したことあるけれど、それがswapして逆に遅くなった。
  • sysctl.confの内容についてとか。
  • webサーバではいらないcronの実効権限を落としておこう chmod 0(ゼロ、一つだけで全員分なのかな)でできるらしい。
  • nfsを利用するときはRPCNFSDCOUNT=を8->32とかに増やしてやろう。
  • 起動時に割り当てるメモリを増やそう < nfs
  • /proc/sys/net/core/rmem_derfaultとか
  • マウントオプションを非同期にする < nfs      async, rw, no_root_squash

freebsdのpythonでmysqlを使いたい

freebsdのpythonでmysqlを使いたい。

具体的にはtracでバックエンドのサーバをmysqlにしたかった。

今回稼働中のpythonは26で、apache上でfcgi(fast cgi)として動いてる。

あまり理解せずに断言すると、pythonは都度、soファイルを呼び出してるらしい。そこでpython用mysqlバイディングなsoファイルを作ればいい。

portsからできれば入れたかったので探してみる。

それっぽいのがいくつかあって困ったけど、どうやらMySQLdbってやつを使うといいらしい。

%sudo portinstall databases/py-MySQLdb

tracの導入に当たっての注意点他

FreeBSD7.3-R, 32bit版にtrac-0.12を入れてみた。

長らく使用してたtrac-0.11はマルチリポジトリに対応して無くて、対応するぞーって言ってた0.12を待ってた。ちょくちょくインストールしたりしてたけど、これまでうまくいかなかった。なんとなく動くようになったぽいのでメモ。

FreeBSD7.3-R i386
apache-2.2.16
py26-sqlite3-2.6.5_1
sqlite3-3.6.23.1_1
trac-0.12

fast cgiモード?で動かす
マルチリポジトリ
全部のリポジトリで共通の認証。リポジトリごとに分けたりもできるぞたぶん。

まずリポジトリのおいてあるサーバとtracを稼働させようとしているサーバが違うのでそこをなんとかする。tracは必ずtracを動かしたローカルにリポジトリがないと駄目らしい。

nfsで見れるようにしようかと思ったけど、うちのnfsってだいたいrw出しちゃうから、一方的に読み取りのみの参照&ネットワークの負荷もかけないってことからrsyncしてみる。良いか悪いかわかんないけど。

crontabに下記を追加。先だって一発コマンドを通しておくとknown_hostsがどうのこうのするはず。ディレクトリが無いとか怒られないためにも。

*/10    *       *       *       *       root    /usr/local/bin/rsync -arv -e "ssh -i /usr/home/hogetan/.ssh/id_dsa" [email protected]:/usr/local/repositories/ /usr/local/repositories/ > /dev/null 2>&1

各種必要なパッケージ?はportinstallで適当に入れる。

%sudo portinstall /usr/ports/www/mod_fcgid

公式を見ながら設定する。

まずはapacheのhttpd.conf

LoadModule fcgid_module libexec/apache22/mod_fcgid.so
<IfModule alias_module>
  ScriptAlias /trac "/usr/local/share/trac/cgi-bin/trac.fcgi"
</IfModule>
<IfModule mod_fcgid.c>
  AddHandler fcgid-script .fcgi
</IfModule>
<LocationMatch "/trac/login">
  AuthType Basic
  AuthName "Trac"
  AuthUserFile /var/trac/.htpasswd
  Require valid-user
</LocationMatch>

scriptaliasを書く位置に注意。あとは.htpasswdが読めないと後で怒られる。.htpassswdの作成とかconfの参考とかは公式
TRAC_ENVはtrac.fcgiに直接書く。なんか理由があったけど忘れた。公式のどこかに書いてあった気がする。

basic認証させるディレクトリの記述に注意。公式通りだと/trac/hogehoge/loginしか受け付けなかったりする。

%sudo ee /usr/local/share/trac.fcgi
import os
os.environ['TRAC_ENV'] = "/var/trac"
os.environ['PYTHON_EGG_CACHE'] = "/tmp"

ここの設定で、TRAC_ENVを書くとそこのディレクトリにあるconf/trac.iniを読もうとするみたい。ここをマルチリポジトリだから~、って、TRAC_ENV_PARENT_DIRを設定すると、そのディレクトリから一つしたのディレクトリをそれぞれの独立したtracのプロジェクトと認識してしまうっぽかった。

(/var/trac/hogeproject/conf/trac.ini, /var/trac/hoge2project/conf/trac.ini, …)と、どんどん参照しちゃうみたい。ここでちょっとはまった。というか以前こんなことやってたけど、それぞれのディレクティブをhttpd.confに書いたりしてた・・・。これを知ってれば、ってかんじ。

次にtracのなんとかディレクトリ?(tracディレクトリとでも呼ぶのかな)、TRAC_ENVで設定されたディレクトリを作成してやる、tracのフォーマットで。

%sudo trac-admin /var/trac initenv

これでできる。nfsだとエラー。ミスったら消して直せば良い。気にくわなければ消して直せば良い。

.htpasswdは個人的な好みで/var/trac直下に。作り方は割愛。このファイルが残っててもinitenvできない。うざい。

次にconf/trac.iniを編集。

Trac 0.12b1が出たね - watawata日記
[repositories]
hoge1.dir=/usr/local/repositories/hoge1
hoge2.dir=/usr/local/repositories/hoge2
hoge3.dir=/usr/local/repositories/hoge3

こんな感じで列挙。元サイトにはtypeとかdescriptionとかあったけど、desc書いたらごちゃごちゃしちゃったし、typeはデフォルトでsvnなので今回はdirのみ定義。下記のコード+適当に選び出すでおk。

%php -r '$h = opendir("/usr/local/repositories"); while($f = readdir($h)){ print basename($f).".dir = /usr/local/repositories/$f\n";}'

そろそろ見て確認してみる。対象サーバのURLにscriptaliasで名付けた/tracとか付ける。


パーミッションとかよく怒ってくるので適当に対処。pythonのエラーは見慣れないので困ったら泣く。結構同じエラーにはまってる人とか少なかったりして泣ける。

tracの管理者権限をそれっぽいユーザに付与。これするとtrac画面の一番右端の方にadminってのが出てきて管理ができるらしい。

%sudo trac-admin /var/trac permission list
%sudo trac-admin /var/trac permission add tracadminisry TRAC_ADMIN

ログインしてTracを使う - へたれプログラマな日々

このあと、adminの画面の一番左下の方にあるrepositriesをクリック。
リポジトリが複数あるかチェック

これだとまだ利用できない。同期?が必要らしい。でも何を同期するんだろう。他にはどんなタイミングで同期すれば良いんだろう。

%sudo trac-admin /var/trac repository resync '*'
%sudo trac-admin /var/trac changeset added '*'

リビジョンが多いと結構時間がかかる。
これが終わったらさっきの管理画面でリビジョンが出てたりする。そんでなんかうまくいけたっぽい。

ここから先はこれから試す。

以上

apacheでhtpasswd使った認証とかできない

apacheでhtpasswd使った認証(?)とかができない。ベーシック認証。httpd.confにAuthUserFileを書いたら怒られたぽい。

l2tp.org%sudo /usr/local/etc/rc.d/apache22 reload
Performing sanity check on apache22 configuration:
Syntax error on line 504 of /usr/local/etc/apache22/httpd.conf:
Invalid command 'AuthUserFile', perhaps misspelled or defined by a module not included in the server configuration

ロードすべきモジュールがわかんないからググった。

何ヶ月ぶりかの動き:apache2 2.2.3-1~exp.r170 – vdrめも

まず authn_file モジュールを有効に。けどこれだけでは駄目で、
次に auth_basic モジュールを有効に。まだ駄目で、
最後に authz_user モジュールを有効にしてやると、これまで通りに使えるようになった。

うちはauthn_fileがコメントアウトされてたのでコメントを外す。

l2tp.org%sudo /usr/local/etc/rc.d/apache22 reload
Performing sanity check on apache22 configuration:
httpd: Syntax error on line 54 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_authn_file.so into server: Cannot open "/usr/local/libexec/apache22/mod_authn_file.so"

と思ったらモジュールがなかった。適当に入れてやって再起動。

%cd /usr/ports/www/apache22; sudo make config; sudo portupgrade -f apache22