三蔵開発メモ

Web開発やインフラ関連のメモを共有します

SELinux有効時にapache管理下の場所でファイルをアップロードしたときにForbidden等になってアクセスできないときの対処法

SELinuxを有効にしているwebサーバーで、 新しいファイルをアップロードすると、アクセスができなくなってしまいはまったのでメモ。

まずどんなラベルがついているかチェック。

ls -Z
-rwxrwxrwx. apache apache system_u:object_r:httpd_sys_content_t:s0 index.html
-rwxrwxrwx. apache apache unconfined_u:object_r:admin_home_t:s0 new.html

この場合、index.htmlはアクセスできていたのだが、
新しくアップロードしたnew.htmlはアクセスができなかった。
同様のラベルをnew.htmlにもつけてあげることにより解決する。

sudo chcon system_u:object_r:httpd_sys_content_t:s0 new.html
-rwxrwxrwx. apache apache system_u:object_r:httpd_sys_content_t:s0 index.html
-rwxrwxrwx. apache apache system_u:object_r:httpd_sys_content_t:s0 new.html

auditログでdeniedになっている個所をチェックするとはまりポイントがわかる

less /var/log/audit/audit.log | grep denied

apache2.4でリバースプロキシ配下での.htaccessでIP制限をかけるときの書き方

apache2.2の時とは書き方が違っていてハマったのでメモ。
index.htmlを192.168.0系のIPアドレスのみ許可する場合。

#192.168.0.1/24
SetEnvIF X-Forwarded-For "^192\.168\.0\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$" AllowIP

<Files index.html>
        <RequireAny>
                Require env AllowIP
        </RequireAny>
</Files>

ちなみにapache2.2の時は以下のように書く

#192.168.0.1/24
SetEnvIF X-Forwarded-For "^192\.168\.0\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$" AllowIP

<Files index.html>
order deny,allow
deny  from all
allow from env=AllowIP
</Files>

MongoDBでpidファイルが作成されないときの対処法

mongoDBをmonitでpidの監視していたが、
時々monitが暴走してmongoDBの再起動コマンドを何度も繰り返してしまうので、
原因を調べたら、pidが作成されていなかった。

・mongodb 2.4
rpmにてインストール

less /etc/init.d/mongod
----------
# processname: mongod
# config: /etc/mongod.conf
# pidfile: /var/run/mongo/mongod.pid

DBPATH=`awk -F= '/^dbpath=/{print $2}' "$CONFIGFILE"`
PIDFILE=`awk -F= '/^dbpath\s=\s/{print $2}' "$CONFIGFILE"`
mongod=${MONGOD-/usr/bin/mongod}
----------

/var/run/mongo がデフォルトだけども、 mongod.confファイルの設定から呼び出される模様。

less /etc/mongod.conf
----------
# location of pidfile
pidfilepath = /var/run/mongodb/mongod.pid
----------

/var/run/mongodb下に作られる模様。

cd /var/run/
ll
mkdir /var/run/mongodb
chown mongod:mongod /var/run/mongodb
service mongod restart

/var/run/下にmongodbフォルダがなかったので作成。
その後再起動したら無事にpidファイルが作成された。

yumでインストールしても/var/run下に pidファイルを置くためのフォルダが作られないようなので注意。

linuxでコマンドが打てないときに確認するメモ

rootとかでは普通にコマンドが打てるのに、
なぜかPHPなどプログラムなどではコマンドが実行できないときにハマったので、
メモ。

mysqlコマンドを「/usr/local/mysql/bin/mysql」に入れてて、それにパスを通していた場合

まずPath確認。

echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr//usr/local/mysql/bin/mysql

このユーザーは実行できるが、webプログラムのphpが実行できない場合、
apacheなどにパスが追加されていないことがある。
だいたいどのユーザーも通っている/usr/bin/下にシンボリックリンクを通し、実行できるようにする。

ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

これでapachemysqlコマンドを実行できるようになる。
ソースから入れた場合や、ダウンロードしてきた場合は注意。

MongoDBのarbiter挙動メモ

MongoDBでレプリカセットを構築したときのアービターの挙動について特徴的だったもののメモ。 (プライマリ,セカンダリ,アービターの3点冗長化状態)

環境:mongo2.4

・3台とも停止した状態で、プライマリを起動
→セカンダリとして起動してしまう。

アービターと、プライマリ、2台で起動しているとき、アービターを止める
→プライマリがセカンダリになってしまう。

アービターはプライマリ、セカンダリの昇格等の判断のみを判定していると思いきや、 レプリカセットの挙動全体を見ているようなので注意。

apacheでつくる503メンテページ

環境:AmazonLinux(CentOS6でも下記やり方できます)
すべてrootユーザーで作業

apacheインストール

sudo yum install httpd

メンテナンスページ作成

vi /var/www/html/maintenance.html
-------------------
now maintenance
-------------------

mod_rewrite.htaccess許可

vi /etc/httpd/conf/httpd.conf
-------------------------------------------------
<Directory "/var/www/html">

Options -Indexes FollowSymLinks

AllowOverride All
Order allow,deny
Allow from all

</Directory>

LoadModule rewrite_module modules/mod_rewrite.so
-------------------------------------------------

.htaccess設定

vi /var/www/html/.htaccess
-------------------------------------------------
ErrorDocument 503 /maintenance.html

RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
#RewriteCond %{REMOTE_ADDR} =IPアドレス
RewriteRule ^.*$ - [R=503,L]
-------------------------------------------------
sudo service httpd start
sudo chkconfig httpd on

IPアドレスにアクセスして、メンテナンスページが表示されて、503が返されていればOK

CloudflontとS3で503を返すメンテナンスページ作成

S3だけでメンテページを作成しようとしたが、S3単体だと503を返すことができないので、
CloudfrontとS3でメンテナンスページを作成したときのメモ。

s3バケットを作成

・まずマネジメントコンソールに入り、S3のバケットを作成。
・作ったバケットの横の虫眼鏡を押して、プロパティを表示。
・「静的サイトホスティング」をクリックし、「ウェブサイトのホスティングを有効にする」を選択。
・「インデックスドキュメント」はなくては作れないので、適当に「index.html」としておく。
・「アクセス許可」を選択し、「バケットポリシーの編集」を選択。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[バケット名]/*"
        }
    ]
}

上記のようにポリシーを作成する(これでアップロードしたものすべてが自動で閲覧可になる)

s3にリソースアップロード

・s3マネジメントコンソールで対象のバケット名をクリックし、右上の「アクション」ボタンを押して、「アップロード」を選択。
ドラッグアンドドロップでhtmlファイル等リソースをアップロード。
・ちゃんと表示されているかどうか先ほどのプロパティ画面の「静的サイトホスティング」のところにある「エンドポイント」にアクセス
(「バケット名.s3-website-ap-northeast-1.amazonaws.com」とかなっているやつ。そこから「/maintenance.html」みたいにリソース名でアクセスできる)

cloudflontを作成

・「create Distribution」を選択。「Web」のほうの「Get Started」を選択。
・「Origin Settings」の「Origin Domain Name」にバケット名を入れる(文字入力すればサジェストされる)
・「Restrict Bucket」をYESにする。 ・「Origin Access Identity」をCreate a New Identityにする。 ・「Grant Read Permissions on Bucket」をYes, Update Bucket Policyにする。 ・下のほうにある「Distribution Settings」内にある「Alternate Domain Names (CNAMEs)」というところに、先ほどのs3のエンドポイントを入力
・あとはデフォルトのまま「Create Distribution」を押して作成する。

Error Pages設定

・cloudflontのサイドメニュー「Distributions」を選択したら、先ほど作ったDistribution一覧にあると思うので、IDをクリック。
・タブメニューの「Error Pages」を選択し、「Create Custom Error Response」を選択。 ・「HTTP Error Code」は「403:Forbidden」、「Error Caching Minimum TTL」はデフォルト。 ・「Customize Error Response」を「Yes」にする。
・「Response Page path」という設定項目がでてくるので、s3に設置したメンテページのhtmlのパスを設定。
(直下に「maintenance.html」というファイルを置いていたら「/maintenance.html」)
・「HTTP Response Code」は「503:Service Unavailable」を選択し、「Create」を選択。

疎通確認

・15分~30分くらいで表示されるようになるので、その後cloudflontのサイドメニュー「Distributions」の一覧のところにある要素「Domain Name」にアクセスする。
(ランダム文字列.cloudfront.netみたいなやつ)
・無事メンテページが表示されて、503がレスポンスで返ってくれば準備完了。
・実際メンテナンスに入る前に、DNSの設定を疎通確認したクラウドフロントの「Domain Name」にすればOK。
※Route53のAlias設定でcloudflontディストリビューションを設定する場合は、Route53の料金がかかりません!

追記

・作りたてのS3は、307 Temporary Redirectを上記設定で疎通を行うと返してくることがたまにある。
対策を調べたのですがこれというものは見つからず、事前にs3バケットのみ用意しておくのがよさそうです。(データ置いとくだけなら1GB月4円くらいなので)