nginxとapacheの共存
参考URL:
- http://abeerforyou.com/?p=430
- https://necomaneki.com/2012/11/apache-nginx-test
- http://abeerforyou.com/?p=430
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:
- http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2-groonga.php
- http://groonga.org/ja/docs/install/centos.html#centos-6
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について
参考サイト
- http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html
- http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locking-reads.html
- http://d.hatena.ne.jp/walf443/20130829/1377788440
サンプル
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