■カスタム版MyNETSとCentOS5で1万人規模のSNSを構築する
友人と運営しているSNSのカスタマイズが一段落したので、ご協力いただいた方々やMyNETSの開発元Usagi Projectの方々に了解をいただき、カスタム版をパッケージにまとめてダウンロードできるようにさせていただいた。近いうちにMyNETSの公式HPからもダウンロードリンクが貼られることになっているが、これまでの集大成でもあるので、こちらでも紹介しておこうと思う。
MyNETSにゃっぽんカスタム版ダウンロード
http://v-nyappon.net/download/
こちらのblogでは内容に沿って、20100921版のINSTALLドキュメントの内容を掲載する(最新の状況は上記URLを参照のこと)。CentOS5.5 x86_64版のインストールとチューニング、CommuniGate ProやTritonnを始めとした関係アプリのインストールと設定、MyNETSの配置と設定など、かなりの長文になっているので、続きはご興味のある方だけどうぞ。
※INSTALL.txtにミスがあったため、0919版は削除して0921版にリンク修正しました。
※このカスタム版を作成するのに当り、本当にたくさんの方々から改修コードとアイデアをご提供いただいたことに深く感謝しています。謝辞はREADMEに、本家との違いはCHANGELOGに入れさせていただいています。ダウンロードの際はぜひご覧いただければと思います。
MyNET1.2.0.4にゃっぽんカスタム版簡易インストール手順 2010.09.19
本インストールドキュメントはCentOS5を例にした大規模SNS構築向けに作成されています。
当該手順で作成した場合、Core i7 860搭載 8GメモリのPCで登録者1万人以上でも快適なSNSを構築できると思われます。
その他環境へインストールする場合には必要に応じて環境に合わせて読み替えてください。
本ドキュメントはLAN内で動作させる前提で記載しています。
セキュリティ設定等は必要最小限になっていますので、適宜サーバの設置状況に応じて追加してください。
便宜上以下の設定で記述します。
サーバ名:sns.example.com
IPアドレス:192.168.0.100
メールアドレス:sns-kanrisya@sns.example.com
■OS環境のインストール
1)CentOS5のインストール
OSインストールイメージのダウンロードは以下より可能
http://isoredirect.centos.org/centos/5/isos/x86_64/
CentOS5.5 x86_64 install DVDからPC起動する
サーバ設定でインストール
webサーバとmailサーバのみ選択
php関連を選択
sendmailの代わりにpostfix選択
2)起動後、不要なサービスを停止
ipv6関連不要
selinuxはdisable
http/https/smtpのみFWオープン
起動サービスは以下に設定
cpuspeed
crond
httpd
iptables
irqbalance
network
sendmail(最初はpostfixリストされない)
readahead_early
sshd
syslog
3)起動後メンテナンス経路設定
rootでlogin
sshd設定変更
[code]# vi /etc/ssh/sshd_config
#Port 22 を Port 10022 に変更[/code]
iptablesの修正
[code]# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 10022 -j ACCEPT[/code]
サービスを再起動
[code]# service sshd restart
# service iptables restart[/code]
以下のコマンドでメンテマシンからアクセス
[code]ssh -p 10022 root@192.168.0.100[/code]
4)サーバ設定を行う
sendmailをremove
[code]# yum remove sendmail[/code]
postfixを起動サービスで追加(postfixにチェック)
[code]#ntsysv[/code]
必要ならproxy設定を追加
[code]# vi /etc/profile.d/proxy.csh
setenv http_proxy http://プロキシURL:ポート/
setenv HTTP_PROXY http://プロキシURL:ポート/[/code]
[code]# vi /etc/profile.d/proxy.sh
export http_proxy=http://プロキシURL:ポート/
export HTTP_PROXY=http://プロキシURL:ポート/[/code]
yumによるアップデートの準備
EPELリポジトリ追加
[code]# mkdir ~/download
# cd ~/download
# wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
# rpm -ihv epel-release-5-4.noarch.rpm
# yum update[/code]
リストされたものをyでインストールする
5)OSのパラメータチューニングを行う
(ディスク名等は環境に合わせて設定してください)
/etc/fstabのマウントオプションとして「noatime」を指定する
[code]# vi /etc/fstab
LABEL=/ / ext3 defaults,noatime 1 1 ←noatimeを追記[/code]
再マウントする
[code]# mount -o remount /[/code]
mountコマンドでnoatimeが有効になっていることを確認
[code]# mount
/dev/sda on / type ext3 (rw,noatime)[/code]
I/Oスケジューラを変更する
/etc/rc.d/rc.local に以下を追記する
[code]# vi /etc/rc.d/rc.local
echo deadline > /sys/block/sda/queue/scheduler[/code]
利用可能な内部通信socketを増やす
/etc/rc.d/rc.local に以下を追記する
[code]# vi /etc/rc.d/rc.local
echo 16384 65535 > /proc/sys/net/ipv4/ip_local_port_range[/code]
プロセススワップを抑制する
/etc/sysctl.confに以下を追記する
[code]# vi /etc/sysctl.conf
vm.swappiness = 0[/code]
1プロセスが同時に開けるファイル数を増やす
[code]# vi /etc/security/limits.conf
root soft nofile 25600
root hard nofile 25600
mysql soft nofile 12800
mysql hard nofile 12800
apache soft nofile 12800
apache hard nofile 12800[/code]
OSの再起動を行う
■アプリケーションの導入と設定
6)高機能メールサーバCommunigateProをインストール
パフォーマンスが高くログが高機能なMTAを導入する。
phpアプリで必要なケースが多いのでpostfixを活かしたままCGPを有効にする
postfix側の設定変更
[code] # vi /etc/postfix/master.cf
smtp inet n – n – – smtpd
↓
#smtp inet n – n – – smtpd
# vi /etc/postfix/main.cf
mydestination = $myhostname, localhost.$mydomain, localhost
↓
mydestination = localhost
追記
relayhost = 192.168.0.100
myhostname = po.sns.example.com
# service postfix start[/code]
postfixがsmtpをLISTENしてないことを確認
[code]# lsof -i[/code]
最新版のCGPをダウンロードしてインストール
[code]# cd ~/download
# wget http://www.communigate.com/pub/CommuniGatePro/CGatePro-Linux.x86_64.rpm
# rpm -ivh CGatePro-Linux.x86_64.rpm
# service CommuniGate start[/code]
CGPの管理画面及びWebMailにアクセスするためにiptableでポート追加
[code]# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 9010 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 9100 -j ACCEPT
# service iptables restart[/code]
ブラウザでhttps://192.168.0.100:9010/へアクセスしてpostmasterのパスワード設定
以降Basic認証で、ID;postmaster パスワード:設定したパスワードでログイン可能
Communityライセンス下で5ユーザまで無料で利用できる
https://192.168.0.100:9010/でアクセスすると最初環境設定が出てくるで以下を設定
[code]Mail Domain Name : sns.example.com
Langage : Japanese
Preferred Charactor Set : UTF8
Time Zone : (+0900) Japan_Koria
interface : expert[/code]
設定>ルータを開き以下の行を最後に追加
[code]; sns setting
<*@sns.example.com> = “php /var/www/sns/www/bin/mail.php”@pipe[/code]
設定>メール>PIPEを開き以下を設定
[code]アプリケーションディレクトリ: /usr/bin[/code]
これでSNS管理者向けアドレスはpostmasterで受信され、携帯メール投稿はphpで処理される。
管理者宛てのメールは以下のアドレスでWebMailで閲覧可能
https://192.168.0.100:9100/
IDパスはpostmasterで設定したものでOK
7)日本語全文検索対応mysql/Tritonn版インストール
mysqlを置き換えるためmysqlがインストールされているか確認
[code]# rpm -qa | grep -i mysql
mysql-5.0.45-7.el5[/code]
mysqlをremove
[code]# yum remove mysql[/code]
perl-DBIのインストールを確認
[code]# rpm -qa | grep -i perl-DBI
perl-DBI-1.52-1.fc6[/code]
最新のtritonn-1.0.12a-mysql-5.0.87パッケージ群をダウンロード
http://sourceforge.jp/projects/tritonn/releases/
[code]# cd ~/download
# wget http://iij.dl.sourceforge.jp/tritonn/44614/MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/44614/MySQL-devel-5.0.87-tritonn.1.0.12a.x86_64.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/44614/MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/44614/MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/44614/mecab-0.98-tritonn.1.0.12a.x86_64.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/44614/mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm
# wget http://iij.dl.sourceforge.jp/tritonn/44614/senna-1.1.4-tritonn.1.0.12a.x86_64.rpm [/code]
以下の順番でインストール
[code]# rpm -ivh mecab-0.98-tritonn.1.0.12a.x86_64.rpm
# rpm -ivh mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm
# rpm -ivh senna-1.1.4-tritonn.1.0.12a.x86_64.rpm
# rpm -ivh MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm
# rpm -ivh MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm
# rpm -ivh MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm
# rpm -ivh MySQL-devel-5.0.87-tritonn.1.0.12a.x86_64.rpm[/code]
MySQLはインストール後すぐに起動するのでrootのパスを設定
[code]# /usr/bin/mysqladmin -u root password ‘rootpassword'[/code]
MySQLへのログイン確認
[code]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is xxxx
Server version: 5.0.87-modified-log MySQL Community Server (GPL) (portions (c) Tritonn Project)
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>[/code]
これでTritonnのインストール完了
mysqlのサーバ設定をする 環境に合わせてcnfを選択
[code]# cp /usr/share/mysql/my-large.cnf /etc/my.cnf[/code]
utf8で使いたい場合には以下の行を各項目で追記
[code][mysqld]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8[/code]
サービス再起動で設定反映(mysqldでないことに注意)
[code]# service mysql restart[/code]
設定変更を確認
[code]# mysql -u root -p
mysql> status
…
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
…[/code]
となっていればOK
続いてmysqldの複数起動設定
[code]# service mysqld stop[/code]
複数起動用my.cnfを作成する
[code]# vi /etc/my.cnf[/code]
サンプル設定はmy.cnf.sampleを参照
sns用に大きな値を割当済み
複数起動用のディレクトリ設定
[code]# mkdir /var/lib/mysql2
# mkdir /var/lib/mysql3
# cp -R /var/lib/mysql/* /var/lib/mysql2
# cp -R /var/lib/mysql/* /var/lib/mysql3
# chown -R mysql:mysql /var/lib/mysql2
# chown -R mysql:mysql /var/lib/mysql3[/code]
起動scriptを設定する
[code]# vi /etc/init.d/mysqld_multi[/code]
script記述内容は同梱のmysqld_multi.sampleを参照
各/etc/rcX.dにてmysql起動状況に合わせてエイリアスを配置
数字は既存mysqlと同じにしておく
[code]# cd /etc/rc0.d/
# ls -l | grep mysql
# ln -s ../init.d/mysqld_multi K36mysqld_multi
# cd ../rc1.d
…[/code]
状況確認(mysqld_multiがリストされていればOK)
[code]# chkconfig –list[/code]
既存mysql起動scriptを無効化
onになっているレベルを全てoffにする
[code]# chkconfig –level 5 mysql off[/code]
これでOK
以下のコマンドで正しく動作することを確認
[code]# service mysqld_multi stop
# service mysqld_multi start[/code]
動作していれば
[code]# lsof -i | grep mysqld
mysqld 3365 mysql 10u IPv4 7087 TCP *:mysql (LISTEN)
mysqld 3366 mysql 10u IPv4 7141 TCP *:13306 (LISTEN)
mysqld 3368 mysql 10u IPv4 7153 TCP *:13307 (LISTEN)[/code]
と表示される。
# ntsysv でmysqld_multiに起動フラグがついていることを確認
8)SNSサーバとしての設定
MyNETSに必要なコンポーネントをインストール
[code]# yum install php-mcrypt php-mbstring php-gd php-mysql php-xmlrpc php-xml php-eaccelerator ImageMagick[/code]
httpd.conf編集
[code]# vi /etc/httpd/conf/httpd.conf[/code]
キープアライブタイムアウトの短時間化
[code]KeepAliveTimeout 7[/code]
プロセスLimitを増やす
[code]
StartServers 10
MinSpareServers 10
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 16000
不要モジュールの無効化
[code]LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
##LoadModule authn_anon_module modules/mod_authn_anon.so
##LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
##LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
##LoadModule ldap_module modules/mod_ldap.so
##LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
##LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
##LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
##LoadModule speling_module modules/mod_speling.so
##LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
##LoadModule proxy_module modules/mod_proxy.so
##LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
##LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
##LoadModule proxy_http_module modules/mod_proxy_http.so
##LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule cgi_module modules/mod_cgi.so
##LoadModule version_module modules/mod_version.so[/code]
他適宜必要に応じて修正
apacheサーバ用snsディレクトリ設定
[code]# mkdir /var/www/sns
# mkdir /var/www/sns/logs[/code]
apacheサーバ用バーチャルホスト設定
[code]# vi /etc/httpd/conf.d/virtual.conf[/code]
script記述内容は同梱のvirtual.confを参照
php関連の設定(利用可能なメモリを増やす)
[code]# vi /etc/php.ini
memory_limit = 128M
# vi /etc/php.d/eaccelerator.ini
eaccelerator.shm_size = “128”[/code]
■MyNETSにゃっぽんカスタム版のインストール
ダウンロードしてファイルを配置する
[code]# cd ~/download
# wget http://v-nyappon.net/download/mynets_custom_nyappon_xxxxxxxx.zip
# unzip mynets_custom_nyappon_xxxxxxxx.zip
# cd mynets_custom_nyappon_xxxxxxxx
# tar zxvf mynets_nyappon.tar.gz
# mv www /var/www/sns/[/code]
アクセス権を設定する
[code]# cd /var/www/sns/www
# chmod -R 0777 img
# chmod -R 0777 skin
# chmod -R 0777 var[/code]
mysqlのデータベースを設定する
[code]# cd /var/www/sns/www# mysql –socket=/var/lib/mysql3/mysql3.sock -u root -p
mysql> grant all privileges on snsdb.* to snsuser@localhost identified by ‘dbpasswd’;
mysql> CREATE DATABASE `snsdb` DEFAULT CHARACTER SET utf8;
mysql> quit
# mysql –socket=/var/lib/mysql2/mysql2.sock -u root -p
mysql> grant all privileges on imgdb.* to imguser@localhost identified by ‘dbpasswd’;
mysql> CREATE DATABASE `imgdb` DEFAULT CHARACTER SET utf8;
mysql> quit[/code]
mysqlデータベースにSNS用データを設定する
[code]# cd ~/download/mynets_custom_nyappon_xxxxxxxx/db-install-sql
# mysql –socket=/var/lib/mysql3/mysql3.sock -u root -p snsdb < install-mynets-nyappon.sql
# mysql --socket=/var/lib/mysql3/mysql3.sock -u root -p snsdb < install-mynets-insert_data.sql[/code]
削除された日記やコメントを保持したい場合には以下を追加で行ってください(にゃっぽんは未使用)
[code]# mysql --socket=/var/lib/mysql3/mysql3.sock -u root -p snsdb < add_keepdelete.sql[/code]
画像用データ設定をする
[code]# mysql --socket=/var/lib/mysql2/mysql2.sock -u root -p imgdb < install-mynets-img.sql[/code]
SNS設定ファイルを編集する
[code]# cd /var/www/sns/www/conf
# vi config.php[/code]
最低限以下の場所を修正
[code]// DBサーバ設定
$GLOBALS['_OPENPNE_DSN_LIST']['main'] = array(
'dsn' => array(
‘phptype’ => ‘mysql’,
‘username’ => ‘snsuser’,
‘password’ => ‘dbpasswd’,
‘hostspec’ => ‘localhost:/var/lib/mysql3/mysql3.sock’,
// ‘port’ => ”
‘database’ => ‘snsdb’,
‘new_link’ => false,
),
);
// DB暗号化キー(56バイト以内のASCII文字列)
define(‘ENCRYPT_KEY’, ”);
// 画像データ保存用DB(オプション)
$GLOBALS[‘_OPENPNE_DSN_LIST’][‘image’] = array(
’dsn’ => array(
‘phptype’ => ‘mysql’,
‘username’ => ‘imguser’,
‘password’ => ‘dbpasswd’,
‘hostspec’ => ‘localhost:/var/lib/mysql2/mysql2.sock’,
‘database’ => ‘imgdb’,
),
);[/code]
SNSにアクセスするマシンで以下の設定をする
[code]# vi /etc/hosts
192.168.0.100 sns.example.com[/code]
ブラウザでSNS設定画面にアクセスする
http://sns.example.com/?m=setup
管理者アカウントを設定後以下の設定を行う(必須ではない)
管理画面>メンバープロフィール管理>プロフィール項目追加から
sns_settingフォルダにある画像のように2つ設定を追加(画像参照)
定期処理用のcrontabを設定する
[code]# crontab -e
05 5 * * * sh /var/www/sns/www/bin/tool_send_dairy_news.cron /var/www/sns/www/bin/ /usr/bin/php
25 5 * * * sh /var/www/sns/www/bin/tool_send_birthday_mail.cron /var/www/sns/www/bin/ /usr/bin/php
45 5 * * * sh /var/www/sns/www/bin/tool_send_schedule_mail.cron /var/www/sns/www/bin/ /usr/bin/php
*/20 * * * * sh /var/www/sns/www/bin/tool_rss_cache.cron /var/www/sns/www/bin/ /usr/bin/php[/code]
以降は標準的なMyNETSとほぼ同じです。
■簡単ログインの脆弱性対策について
「簡単ログイン機能を携帯キャリアIPからのみに制限」の機能追加のため、OpenPNE 2.14.1 の以下のファイルを使用しています。
・ IPv4.php は、OpenPNE 2.14.1パッケージのファイルを
そのまま同梱しています。
・ ktaiIP.php は、OpenPNE 2.14.1パッケージのファイルを元にしています。
・ is_ktai_easy.ip は、OpenPNE 2.14.1パッケージの function is_ktai_ip()
をコピーしたうえで、MyNets用に修正しています。
MyNETS の config.php にて以下の設定をした場合は、
define(‘CHECK_KTAI_IP’, true);
上記の機能が有効となります。
ついては、 ktaiIP.php に対して定期的なメンテナンスを実施してください。
http://www.openpne.jp/pne-downloads/mobile_ip_list/
のOpenPNE2.14 用のIP アドレス帯域リストが使用可能です。
■運用のケアポイント
データベースの肥大化を避けるために定期的にsnsdbのc_access_log,c_ashiato,c_etsuranの3つのテーブルを必要な
期間だけ残して残りを削除することをオススメします。
no comment untill now