AB Lab

プログラミング備忘録

nginxとapacheの共存

参考URL:

nginxでリバースプロキシした際にIP情報を正しく取れるようにモジュールを追加

sudo yum install httpd-devel

cd /root/tmp
wget http://www.openinfo.co.uk/apache/extract_forwarded-2.0.2.tar.gz
tar zxf extract_forwarded-2.0.2.tar.gz
cd extract_forwarded
apxs -i -c -a mod_extract_forwarded.c

apacheの実行ユーザーとポートを変更

vim /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf
Listen 8080

#####
User nginx
Group nginx
#####
ServerName sample.jp:8080

# 最終行に追加
MEForder refuse,accept
MEFrefuse all
# Nginx(リバースプロキシ)のIPアドレス
MEFaccept 127.0.0.1


# ヴァーチャルホスト使っている場合はヴァーチャルホストのポートも変更

apacheを再起動して設定を反映

service httpd restart

nginxでの転送設定

cd /etc/nginx/conf.d
vim default.conf
default.conf
#デフォルトサーバー
server {
    listen       80;
    server_name  abgata.biz;

    # このサーバへの全てのアクセスを転送
    location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect                         off;

            # この設定がなくても.htaccessでの制限は可能。
            # ただし、cgi等から参照した際にNginxのIPアドレスになる。
            proxy_set_header Host                   $host;

            proxy_set_header X-Real-IP              $remote_addr;

            # 以下は、cgi等で明示的に利用していなければ、有効にする必要なし。
            proxy_set_header X-Forwarded-Host      $host;
            proxy_set_header X-Forwarded-Server    $host;

            # この設定がなくてもcgi等から正しいIPを確認可能。
            # ただし、.htaccessでの制限は不可。
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    }
}

最初に↓入れたほうがいいかも??

# キャッシュ関連設定
proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:4m max_size=50m inactive=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;

# バックエンドサーバ−(Apache)設定
upstream backend {
    ip_hash;
    server 127.0.0.1:8080;
}

nginxを再起動して設定を反映

service nginx restart

nginxのインストール

vim /etc/yum.repos.d/nginx.repo
/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
sudo yum install -y nginx

cd /etc/nginx
sudo mkdir sites-avalable
sudo mkdir sites-enabled
# sudo rm -f conf.d/*.conf

cd conf.d
cp default.conf default.conf.org
cp example_ssl.conf example_ssl.conf.org


cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org

sudo vim /etc/nginx/nginx.conf
/etc/nginx/nginx.conf
# 下から二行目に追加

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

自動起動をON

service nginx start

chkconfig nginx on

MySQL用のストレージエンジン「Mroonga」の設定

参考URL:

rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
# --sorceで強制的に上書き
yum makecache
yum -y update

yum -y install mysql-server
# version5.1.67を指定しないとだめかも

yum install -y groonga groonga-devel groonga-tokenizer-mecab mecab-ipadic mecab-jumandic

MySQLの設定

cp /etc/my.cnf /etc/my.cnf.org
vim /etc/my.cnf

MySQLの初期設定

mysql_secure_installation

MySQLを起動

service mysqld start
yum -y install mysql-groonga
service mysqld restart
chkconfig mysqld on
mysql -u root -p

利用可能なストレージエンジンを確認

mysql> SHOW ENGINES \G

MySQLのバックアップを自動化

cd 

mkdir backup
mkdir backup/mysql

vim mysql_backup.sh
mysql_backup.sh
#!/bin/sh

# バックアップファイルを何日分残しておくか
period='+7'
# バックアップファイルを保存するディレクトリ
dirpath='/path/to/backup/mysql'
#mysql password
mysqlpassword="passwd"

# ファイル名を定義(※ファイル名で日付がわかるようにしておきます)
mydate=`date +%y%m%d%H%M%S`
filename="mysql_$mydate.sql"
# mysqldump実行
mysqldump -uroot -p$mysqlpassword -A -E > $dirpath/$filename

# パーミッション変更
chmod 700 $dirpath/$filename

# 古いバックアップファイルを削除
find $dirpath -type f -daystart -mtime $period -exec rm {} \;

実行権限を付与

chmod 700 mysql_backup.sh

cronをインストール

yum install cronie-anacron
# cron.dailyをランダム実行したくない場合は yum -y install cronie-noanacron

chkconfig --level 2345 crond on
chkconfig --list crond  

crontab -e
0 3 * * * bash /path/to/mysql_backup.sh

設定済みのクーロンを確認

crontab -l

MySQLのレプリケーション設定

マスター側設定

レプリケーション用のユーザーを作成

GRANT REPLICATION SLAVE ON *.* TO repl@% IDENTIFIED BY 'password';

my.cnf(winの場合はmy.ini)を修正(追加)

[mysqld]
log-bin = mysql-bin
server-id = 1001

mysqlを再起動

service mysqld restart

mysqlのスナップショットを作成

mysqlにて

# DBロック
FLUSH TABLES WITH READ LOCK;

# 現在のバイナリポジションを取得
SHOW MASTER STATUS;

# File、Positionはスレーブ側の設定に必要なので控えておく

別ターミナル等でDBのバックアップを取る(mysqldumpを利用)

mysqldump -u user -p --all-databases --lock-all-tables > snapshot.db

DBロックを解除

mysqlにて

UNLOCK TABLES;

スレーブ側設定

my.cnfを修正(追加)

[mysqld]
log-bin=mysql-bin
log_slave_updates #このスレーブを他のマスターとして使いたい場合追加
server-id=1002

マスタで作成したスナップショットを復元

mysql -u user -p  < snapshot.db

mysqlを再起動

service mysqld restart

マスタ情報を登録

CHANGE MASTER TO
MASTER_HOST='sample.com',
MASTER_USER='rep-user',
MASTER_PASSWORD='passwd',
MASTER_LOG_FILE='mysql-bin.000001', #マスターのFIle
MASTER_LOG_POS=98; #マスターのPosition

スレーブをスタート

START SLAVE;
# STOP SLAVE;RESTART SLAVE;RESET SLAVE;

起動確認

SHOW SLAVE STATUS\G

select_for_updateについて

参考サイト

サンプル

begin;

select * from t_sample where id > 1 AND flg = 0 order by id asc limit1 for update;

commit;
# コミットするまでは、同一のレコードへ処理(select文を含む)をロックする

注意点

  • トランザクションの効くストレージエンジン(innodb)でのみ有効
  • for update をつけていないクエリはロックされない
  • 同一のレコードへの処理をロックするため別条件で別レコードへの処理はロックされない
where id = 1

where id = 2

であればロックされない

where id > 1

where id = 2

であればロックされる

ActiveRecordでの利用方法

Sample.transaction do
    # select * from table where flg = 0 limit 1 for update
    @target = Sample.where("flg = 0 ").lock(true).first

    @target['flg'] = 1
    @target.save

end