サーバとか」カテゴリーアーカイブ

MySQLでの日付の計算

MySQLでの日付の計算について。

■ テーブル構成

テーブル名:t_test

フィールド:id      :ユニークなID

     :data     :データ

     :regist_date  :登録日時

     :update_date  :更新日時

例えば、上記テーブルにて、直近2週間に登録されたデータを取得したい場合、

select * from t_test where regist_date between date_add(current_date, interval -2 week) and current_date;

と、なります。

直近3日の場合は、

select * from t_test where regist_date between date_add(current_date, interval -3 day) and current_date;

と。

date_add()を使うと便利でいいですね。

でわ。

MySQLの詳細ログ出力設定について

例えば、会員登録サイトを構築して会員情報の検索が遅い時、

まずはSQLを調べますよね?

PHP等でO/Rマッパーを使っている場合、

実際にどのようなSQLが投げられているかがよくわからなかったりします。

そんな時は、ログを出力するようにしましょう。

設定は簡単です。

my.cnf に設定を追加するだけです。

# cd /etc

# vi my.cnf

[mysqld]

log=/var/log/mysqld_detail_access.log

これだけ。

設定追加後は、MySQLのプロセス再起動をしましょう。

これで、MySQLに実際に投げられているクエリがログに出力されます。

実際に見てみるとわかりますが、思った以上にゴリゴリとSQLが投げられています。

開発効率を考えてO/Rマッパーを使うのもいいですが、

素でSQLを書いた方がパフォーマンスチューニングしやすいかな、と思ったり。

でわ。

MySQLのトリガーの勉強

業務で、既存テーブルと新規テーブルとの整合性を取る必要が出てきたので、

MySQL5.0 から実装された、トリガーを使おうかと。

多少書き方は違えど、Oracleと似たり寄ったりかな、との認識。

データが2重管理になるので、出来れば既存か新規か、テーブルを寄せたかったのだが、

時既に遅し。。。orz

頑張ろう。

でわ。

PHPでOracle接続

簡単に手順を書きます。

前提として、

OS:CentOS3.9

Apache:2系

PHP:4.4.114.4.1

Oracle:10.2.0.3

です。

1) Oracleのサイトより、Oracle Instant Client をダウンロードする

oracle-instantclient-basic-10.2.0.3-1.i386.rpm

oracle-instantclient-devel-10.2.0.3-1.i386.rpm

これだけでも良いが、接続確認の為、SQLPlusも。

oracle-instantclient-sqlplus-10.2.0.3-1.i386.rpm

2) PHPのインストール

configureオプションに以下を付与する

–with-oci8-instant-client=shared,/usr/lib/oracle/10.2.0.3/client/lib

3) php.iniの編集

以下を追加

extension_dir = “#PHPインストールディレクトリ#/lib/php/extensions/no-debug-non-zts-20020429/”

extension=oci8.so

4) 環境変数の設定

LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib/

ORACLE_HOME=/usr/lib/oracle/10.2.0.3/client

文字化けするようなら、NLS_LANG も追加

5) Apacheの再起動

/etc/rc.d/init.d/httpd stop

/etc/rc.d/init.d/httpd start

6) 接続確認

sqlplus system/manager@DB_SERV_NAME:1521/SID

上記を実行して、以下が表示されればOK

SQL*Plus: Release 10.2.0.3.0 – Production on Wed Mar 25 02:33:57 2009

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Release 10.2.0.3.0 – Production

SQL>

7) テストスクリプトにて、PHPから接続出来る事を確認

以下サイトを参考にしました

http://www.doyouphp.jp/inst/inst_unix_dso_430_ic.shtml

これで、テーブルの中身が表示されれば、PHPからのOracle接続は成功!

でわ。

PHPでImageMagick

ちょっとハマった。

前提として、

・php-devel

・ImageMagick-devel

がインストールされている事。

もし、インストールされていないのであれば、

# yum install php-devel

# yum install ImageMagick-devel

を実施の事。

で、本題。

PHPからImageMagickを使用する為に、ライブラリをインストールします。

# pecl install imagick

<snip>

Build process completed successfully

Installing ‘/var/tmp/pear-build-root/install-imagick-2.2.2//usr/lib/php/modules/imagick.so’

install ok: channel://pecl.php.net/imagick-2.2.2

You should add “extension=imagick.so” to php.ini

#

との事なので、php.iniに、

extension=imagick.so

を追加。

んでもって、Apacheの再起動。

# /etc/rc.d/init.d/httpd restart

phpinfoを確認したのだが、「imagick」の項目がない。

おかしいな???

と思いつつ、Apacheのログを確認すると、

PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/modules/imagick.so’ – /usr/lib/php/modules/imagick.so: undefined symbol: ClonePixelWand in Unknown on line 0

の記載が。。。

色々調べたところ、どうやら、imagick のバージョンが、2.2.2 ではダメみたい。

なので、2.2.1 をインストール。

# pecl install imagick-2.2.1

<snip>

Build process completed successfully

Installing ‘/var/tmp/pear-build-root/install-imagick-2.2.2//usr/lib/php/modules/imagick.so’

install ok: channel://pecl.php.net/imagick-2.2.2

You should add “extension=imagick.so” to php.ini

#

おk。

Apache再起動。

# /etc/rc.d/init.d/httpd restart

Apacheのログを見て、エラーが出てない事を確認。

phpinfo を見て、imagick の項目が表示されている事を確認。

諸々完了。

よかった。

でわ。

CentOS5でのPHPのアップデート

またまた久々のネタ。

CentOS5.2 での、PHPの標準は、5.1.6 です。

OpenPNE3.0を使用するにあたり、これを、5.2.6 以上にしなければなりません。

しかしながら、RPMを消したり入れたりは面倒だからイヤ。

で、どうするか。

remiリポジトリから、取ってくるのです。

# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-2.noarch.rpm

# wget http://rpms.famillecollet.com/el5.i386/remi-release-5-4.el5.remi.noarch.rpm

# rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm

リポジトリのファイルをちょっといじる。

# cd /etc/yum.repos.d/

# vi remi.repo

[remi]

name=Les RPM de remi pour Enterprise Linux 5 – $basearch

baseurl=http://rpms.famillecollet.com/el5.$basearch/

    http://remi.collet.free.fr/rpms/el5.$basearch/

    http://iut-info.univ-reims.fr/remirpms/el5.$basearch/

enabled=0 → 1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

failovermethod=priority

PHPをアップデート。

# yum update php*

これで完了。

mysqlが入ってる場合、mysql-lib で引っかかるかも。

その場合は、まずは、

# yum update mysql*

で、mysql自体をアップデートしちゃって下さいな。

って感じです。

でわでわ。

tcpwrapperによる接続制限(日本国内からのみの接続許可)

久々にネタが書けた。

中国・韓国を筆頭に、不正アクセスが非常に多いです。

手軽にアクセス制限をするのであれば、tcpwrapper を使用するのが楽チン。

例えば、社内に設置しているサーバで、外部公開しているサーバで、

社内のローカルIPと、日本国内のみの接続としたい場合、

# vi /etc/hosts.allow

sshd : 192.168.

sshd : .jp

sshd : .bbtec.net #YahooBBは特別

# vi /etc/hosts.deny

sshd : ALL

これでおk。

.jp のみの指定だと、YahooBBが引っかかるのですわ。

ちなみに、FTP に vsftpd を使用している場合、

# vi /etc/vsftpd/vsftpd.conf

tcp_wrappers=YES

# vi /etc/hosts.allow

vsftpd : 192.168.

vsftpd : .jp

vsftpd : .bbtec.net #YahooBBは特別

# vi /etc/hosts.deny

vsftpd : ALL

これでおk。

でわ。

Apache起動エラー回避

久々に書けた。

先日、色んなVirtualHostが切ってあるサーバに、新たにWebコンテンツの設置をしたのだが・・・

そこで、少しハマりました。

PHP5.1.6で運用しているサーバだったのですが、元Webアプリが、PHP5.2以上で作られているようで、

「json_encoding」が無い、とエラーが。

php-json をサックリDLし、インスコ。

[user@host ~]$ cd /usr/local/src

[user@host src]$ wget http://www.aurore.net/projects/php-json/php-json-ext-1.2.1.tar.bz2

–21:02:57– http://www.aurore.net/projects/php-json/php-json-ext-1.2.1.tar.bz2

Resolving www.aurore.net… 72.36.165.74

Connecting to www.aurore.net|72.36.165.74|:80… connected.

HTTP request sent, awaiting response… 200 OK

Length: 150206 (147K) [application/x-bzip2]

Saving to: `php-json-ext-1.2.1.tar.bz2′

100%[================================================================>] 150,206 172K/s in 0.9s

21:02:59 (172 KB/s) – `php-json-ext-1.2.1.tar.bz2′ saved [150206/150206]

[user@host src]$ tar jxf php-json-ext-1.2.1.tar.bz2

[user@host src]$ cd php-json-ext-1.2.1

[user@host php-json-ext-1.2.1]$ cd php-json-ext-1.2.1

[user@host php-json-ext-1.2.1]$ ./configure

checking for gcc… gcc

(snip…)

PATH=”$PATH:/sbin” ldconfig -n /usr/local/src/php-json-ext-1.2.1/modules

———————————————————————-

Libraries have been installed in:

/usr/local/src/php-json-ext-1.2.1/modules

If you ever happen to want to link against installed libraries

in a given directory, LIBDIR, you must either use libtool, and

specify the full pathname of the library, or use the `-LLIBDIR’

flag during linking and do at least one of the following:

– add LIBDIR to the `LD_LIBRARY_PATH’ environment variable

during execution

– add LIBDIR to the `LD_RUN_PATH’ environment variable

during linking

– use the `-Wl,–rpath -Wl,LIBDIR’ linker flag

– have your system administrator add LIBDIR to `/etc/ld.so.conf’

See any operating system documentation about shared libraries for

more information, such as the ld(1) and ld.so(8) manual pages.

———————————————————————-

Build complete.

(It is safe to ignore warnings about tempnam and tmpnam).

[user@host php-json-ext-1.2.1]# su

[root@host php-json-ext-1.2.1]# make install

Installing shared extensions: /usr/lib/php/modules/

でもって、php.ini に、追記。

[root@host php-json-ext-1.2.1]# vi /etc/php.ini

extension=json.so

これでおk。

で、ここで、問題発生なのです。

[root@host php-json-ext-1.2.1]# /etc/rc.d/init.d/httpd restart

Stopping httpd: [ OK ]

Starting httpd: Warning: DocumentRoot [/home/ucube-admin/www] does not exist

(98)Address already in use: make_sock: could not bind to address [::]:80

(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80

no listening sockets available, shutting down

Unable to open logs

[FAILED]

すでに80のポートが使われてると?

netstat で見ると、確かにポートが開いている。

しかし、httpd のプロセスは死んでいる。

という事で、どのプロセスが80のポートを使っているかを確認しましょうって事で、

fuserコマンドで、プロセスIDを調べる。

[root@host php-json-ext-1.2.1]# fuser -n tcp 80

80/tcp: 7909

と、プロセスID:7909 のプロセスが、どうやら80のポートを掴んでるようで。

では、そのプロセスは何か?

[root@host php-json-ext-1.2.1]# ps auxww | grep 7909

apache 7909 0.0 0.1 2340 1336 ? Ss Nov18 1:11 bash

bash?

うまくApacheの停止が出来なかったのかな?

とりあえず、そのプロセスを殺して、再度確認。

[root@host php-json-ext-1.2.1]# kill -9 7909

[root@host php-json-ext-1.2.1]# fuser -n tcp 80

[root@host php-json-ext-1.2.1]#

おk。

Apache起動。

[root@host php-json-ext-1.2.1]# /etc/rc.d/init.d/httpd start

Starting httpd: [ OK ]

はい、これで完了!!

長時間運用しているサーバだと、こういった事が起こりうるので、

慌てず、騒がず、冷静に対処しましょうって事で。

でわ。

パスワード無しでSSH接続

ハマりました。。。

環境としてはこんな感じ。

■ Client

OS:CentOS 5.2

IP:192.168.10.10

User:manager

■ Server

OS:CentOS 5.2

IP:192.168.10.11

User:manager

手順は以下。

まずは、Clientにて、鍵を作成

[manager@Client ~]$ cd /home/manager

[manager@Client ~]$ mkdir .ssh

[manager@Client ~]$ ssh-keygen -t dsa

Generating public/private dsa key pair.

Enter file in which to save the key (/home/manager/.ssh/id_dsa): [ENTER]

Enter passphrase (empty for no passphrase): [ENTER]

Enter same passphrase again: [ENTER]

Your identification has been saved in /home/manager/.ssh/id_dsa.

Your public key has been saved in /home/manager/.ssh/id_dsa.pub.

The key fingerprint is:

b4:71:5b:a8:27:ac:e9:2a:0c:f8:6b:99:3d:df:2f:3a manager@192.168.10.10

次に、Clientのパーミッションの設定

[manager@Client ~]$ chmod 700 ./.ssh

[manager@Client ~]$ cd ./.ssh

[manager@Client ~/.ssh]$ chmod 600 ./id_dsa.pub

Clientで作成した公開鍵を、Serverへアップ

[manager@Client ~/.ssh]$ ftp 192.168.10.11

Connected to 192.168.10.11.

220 Welcome to blah FTP service.

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (192.168.10.11:manager): manager

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> put id_dsa.pub

local: id_dsa.pub remote: id_dsa.pub

227 Entering Passive Mode (192,168,10,11,114,96)

150 Ok to send data.

226 File receive OK.

610 bytes sent in 4.8e-05 seconds (1.2e+04 Kbytes/s)

ftp> quit

221 Goodbye.

Clientでの作業はここまで。

次はServerでの作業。

[manager@Server ~]$ mkdir ./.ssh

[manager@Server ~]$ mv ./id_dsa.pub ./.ssh

[manager@Server ~]$ chmod 700 ./.ssh

[manager@Server ~]$ cd .ssh

[manager@Server ~/.ssh]$ chmod 600 ./id_dsa.pub

[manager@Server ~/.ssh]$ mv ./id_dsa.pub ./authorized_keys

で、あとは、Clientから、ssh接続して、パスワードを聞かれなければOK。

が、ここでハマった。

何度やってもパスワードを聞かれる。

調査したところ、Server側のユーザのホームディレクトリのパーミッションが原因でした。

どうやら、700 じゃないと、ダメのようで。

2時間も無駄にしたよ。。。orz

でわ。