オラクる。

oracle専門ブログにしてみようかな~っと

カテゴリ: Linux

Nginxのログを外部のFluentdに転送する検証をしてみます。

log_format  ltsv  'time:$time_iso8601\t'
                      'remote_addr:$remote_addr\t'
                      'request:$request\t'
                      'request_method:$request_method\t'
                      'request_length:$request_length\t'
                      'request_uri:$request_uri\t'
                      'uri:$uri\t'
                      'query_string:$query_string\t'
                      'status:$status\t'
                      'bytes_sent:$bytes_sent\t'
                      'body_bytes_sent:$body_bytes_sent\t'
                      'referer:$http_referer\t'
                      'useragent:$http_user_agent\t'
                      'forwardedfor:$http_x_forwarded_for\t'
                      'request_time:$request_time\t'
                      'upstream_response_time:$upstream_response_time';
access_log  /var/log/nginx/access.log ltsv;


ログファイルのフォーマットは上記のようにtabで区切られたltsv形式を採用します。
WEBサーバのアクセスログに適しているようです。

[root@nginx01 ~]# less /var/log/nginx/access.log



time:2016-04-06T00:58:33+09:00  remote_addr:172.17.9.91 request:GET / HTTP/1.1  request_method:GET      request_length:402      request_uri:/   uri:/index.html query_string:-  status:304      bytes_sent:180  body_bytes_sent:0       referer:-       useragent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0      forwardedfor:-  request_time:0.000      upstream_response_time:-

このようなログになります。

[root@nginx01 ~]# cat /etc/yum.repos.d/treasuredata.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0

[root@nginx01 ~]# yum --enablerepo=treasuredata install td-agent



インストール:
  td-agent.x86_64 0:1.1.21-0

依存性関連をインストールしました:
  compat-libtermcap.x86_64 0:2.0.8-49.el6                compat-readline5.x86_64 0:5.2-17.1.el6
  openssl098e.x86_64 0:0.9.8e-18.el6_5.2                 td-libyaml.x86_64 0:0.1.4-1


完了しました!

公式のレポジトリを使用してnginx側にもfluentdをインストールします。

[root@nginx01 ~]# chkconfig td-agent on
[root@nginx01 ~]# /usr/lib64/fluent/ruby/bin/fluent-gem update


サービスの起動設定、fluentdプラグインのインストールを行ないます。

[root@nginx01 ~]# vi /etc/td-agent/td-agent.conf

<source>
    type tail
    path /var/log/nginx/access.log
    pos_file /var/log/td-agent/buffer/access.log.pos
    format none
    tag nginx.access
</source>

<match *.**>
  type forward
  retry_limit 5
  flush_interval 5s
  <server>
    host 192.168.200.2
    port 24224
  </server>
</match>


nginxのログファイルを外部のfluentdサーバに転送する設定ファイルを作成します。

[root@nginx01 ~]# mkdir /var/log/td-agent/buffer
[root@nginx01 ~]# touch /var/log/td-agent/buffer/access.log.pos
[root@nginx01 ~]# chmod 777 /var/log/td-agent/buffer/access.log.pos


posファイルは自動的に作成されないので、この時点で作成します。

nginxのアクセスログ、エラーログのローテート設定をしてみます。

[root@nginx01 ~]# touch /etc/logrotate.d/nginx
[root@nginx01 ~]# chmod 644 /etc/logrotate.d/nginx
[root@nginx01 ~]# ls -al /etc/logrotate.d/nginx
-rw-r--r-- 1 root root 0  4月  5 00:25 2016 /etc/logrotate.d/nginx

まずはlogrotateフォルダにnginxの設定ファイルを作成
権限はroot以外は書き込めないようにします

[root@nginx01 nginx]# cat /etc/logrotate.d/nginx
"/var/log/nginx/access.log" "/var/log/nginx/error.log" {
  missingok
  notifempty
  daily
  rotate 7
  create 644 root root
  compress
  delaycompress
  sharedscripts
  postrotate
      [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
  endscript
}


logroateの設定ファイルを一行一行説明してみます。

missingok・・・ログファイルが見つからなくてもエラーにしない
notifempty・・・ログイファイルが空ならローテーションしない
daily・・・一日ごとにローテートします
rotate 7・・・7世代保持します
create 644 root root・・・ローテートで新しく作成されるログファイルの権限、所有者を指定します
compress・・・過去のログファイルを圧縮します
delaycompress・・・1世代前は圧縮しません
sharedscripts・・・スクリプトの記述が始まります
postrotate・・・ローテーションの後に
 [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`・・・nginxが起動していれば、ログファイルの再読み込みを行ないます
endscript・・・ここまでがスクリプトの記述

[root@nginx01 ~]# ls -al /var/log/nginx/
合計 24
drwxr-xr-x   2 root  root 4096  4月  5 00:43 2016 .
drwxr-xr-x. 14 root  root 4096  4月  3 03:35 2016 ..
-rw-r--r--   1 nginx root  161  4月  5 00:43 2016 access.log
-rw-r--r--   1 root  root  471  4月  5 00:42 2016 access.log.1
-rw-r--r--   1 nginx root  202  4月  5 00:43 2016 error.log
-rw-r--r--   1 root  root  202  4月  5 00:42 2016 error.log.1


実際にrotateのテストを行なってみます。

[root@nginx01 ~]# logrotate -f /etc/logrotate.d/nginx
[root@nginx01 ~]# ls -al /var/log/nginx/
合計 24
drwxr-xr-x   2 root  root 4096  4月  5 00:57 2016 .
drwxr-xr-x. 14 root  root 4096  4月  3 03:35 2016 ..
-rw-r--r--   1 nginx root    0  4月  5 00:57 2016 access.log
-rw-r--r--   1 nginx root  161  4月  5 00:43 2016 access.log.1
-rw-r--r--   1 root  root  184  4月  5 00:57 2016 access.log.2.gz
-rw-r--r--   1 nginx root    0  4月  5 00:57 2016 error.log
-rw-r--r--   1 nginx root  202  4月  5 00:43 2016 error.log.1
-rw-r--r--   1 root  root  187  4月  5 00:57 2016 error.log.2.gz


logrotateの-fコマンドで強制的にローテートを行わせることが出来ます。
2世代のログが3世代になり、3世代目が圧縮されていることがわかります。

サーバー側の設定が終わったので、次はopenldapで認証するクライアント(今回はnginx)側の設定を行ないます。

[root@nginx01 ~]# yum install authconfig openldap-clients nss-pam-ldapd openldap-devel

クライアント側で必要なモジュール、またnginxでldap認証を利用するために必要なモジュールをインストールします。

[root@nginx01 ~]# authconfig  --enableldap  --enableldapauth  --ldapserver="ldap://192.168.200.100/"  --ldapbasedn="dc=test,dc=local"  --enablemkhomedir  --update
[root@nginx01 ~]# chkconfig nslcd on


authconfigコマンドでldapサーバー、ドメイン名の指定を行ないます。
また、ldapクライアントデーモンのnslcdの自動起動をオンにします。

[root@nginx01 ~]# ssh user01@localhost
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is c6:59:b7:cc:d3:17:e4:d7:6f:a9:18:4f:bd:fd:42:5d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
user01@localhost's password:
Creating directory '/home/user01'.
[user01@nginx01 ~]$ whoami
user01


早速、ldapユーザーでSSHにアクセス
正常にユーザー認証が行えることを確認しました。

[root@nginx01 nginx-1.9.12]# git clone https://github.com/kvspb/nginx-auth-ldap.git
Initialized empty Git repository in /tmp/src/nginx-1.9.12/nginx-auth-ldap/.git/
remote: Counting objects: 306, done.
remote: Total 306 (delta 0), reused 0 (delta 0), pack-reused 306
Receiving objects: 100% (306/306), 119.37 KiB, done.
Resolving deltas: 100% (165/165), done.


さらに、nginxのldap用プラグインをダウンロードします。

[root@nginx01 nginx-1.9.12]# ./configure --user=nginx --group=nginx --prefix=/etc/nginx/ --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-http_ssl_module --with-openssl=/tmp/openssl-1.0.2g --with-http_realip_module --add-module=nginx-auth-ldap


さらに、ldapモジュールを組み込んで、nginxをconfigureします。

[root@nginx01 nginx-1.9.12]# make && make install

nginxソースのコンパイル、インストールを行ないます。

[root@nginx01 nginx-1.9.12]# nginx -V
nginx version: nginx/1.9.12
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/etc/nginx/ --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-http_ssl_module --with-openssl=/tmp/openssl-1.0.2g --with-http_realip_module --add-module=nginx-auth-ldap


nginxの-Vコマンドでldapモジュールが組み込まれていることを確認します。

openldapのインストールが完了したので、ユーザー、グループを作成します。
構成情報の元となるldifファイルを作成し、ldapaddコマンドでファイルを読み込み、ユーザー、グループなどのオブジェクトを格納します。

[root@ldap01 ~]# cat init.ldif
dn: dc=test,dc=local
objectClass: dcObject
objectClass: organization
o: myorganization
dc: test

dn: cn=Manager,dc=test,dc=local
objectClass: organizationalRole
cn: Manager

dn: ou=People,dc=test,dc=local
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=test,dc=local
objectClass: organizationalUnit
ou: Group

[root@ldap01 ~]# ldapadd -x -D "cn=manager,dc=test,dc=local" -W -f init.ldif
Enter LDAP Password:
adding new entry "dc=test,dc=local"

adding new entry "cn=Manager,dc=test,dc=local"

adding new entry "ou=People,dc=test,dc=local"

adding new entry "ou=Group,dc=test,dc=local"


まずはドメイン本体、OUを作成します。
test.localドメインにManager、People、GroupというOUが作成されました。

[root@ldap01 ~]# cat group.ldif
dn: cn=group01,ou=Group,dc=test,dc=local
objectClass: posixGroup
objectClass: top
cn: member01
gidNumber: 3001

dn: cn=group02,ou=Group,dc=test,dc=local
objectClass: posixGroup
objectClass: top
cn: member02
gidNumber: 3002

dn: cn=group03,ou=Group,dc=test,dc=local
objectClass: posixGroup
objectClass: top
cn: member03
gidNumber: 3003

[root@ldap01 ~]# ldapadd -x -D "cn=manager,dc=test,dc=local" -W -f group.ldif
Enter LDAP Password:
adding new entry "cn=group01,ou=Group,dc=test,dc=local"

adding new entry "cn=group02,ou=Group,dc=test,dc=local"

adding new entry "cn=group03,ou=Group,dc=test,dc=local"


続いてグループを作成します。
group01,02,03というグループが作成されました。

[root@ldap01 ~]# cat user.ldif

dn: uid=user01,ou=People,dc=test,dc=local
uid: user01
cn: Test User 01
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {CRYPT}YDgPa.WUDLqp.
loginShell: /bin/bash
uidNumber: 5001
gidNumber: 3001
homeDirectory: /home/user01

dn: uid=user02,ou=People,dc=test,dc=local
uid: user01
cn: Test User 02
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {CRYPT}YDgPa.WUDLqp.
loginShell: /bin/bash
uidNumber: 5002
gidNumber: 3002
homeDirectory: /home/user02

dn: uid=user03,ou=People,dc=test,dc=local
uid: user03
cn: Test User 03
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {CRYPT}YDgPa.WUDLqp.
loginShell: /bin/bash
uidNumber: 5003
gidNumber: 3003
homeDirectory: /home/user03

[root@ldap01 ~]# ldapadd -x -D "cn=manager,dc=test,dc=local" -W -f user.ldif
Enter LDAP Password:
adding new entry "uid=user01,ou=People,dc=test,dc=local"

adding new entry "uid=user02,ou=People,dc=test,dc=local"

adding new entry "uid=user03,ou=People,dc=test,dc=local"


続いてユーザーを作成します。
user01,02,03というユーザーが作成されました。

以上で、openldapサーバー側の準備が整いました。
次回はクライアント側の設定をしてみます。

前回まででopenldapをインストールしたので、起動、停止を確認してみます。

[root@ldap01 ~]# id ldap
id: ldap: そのようなユーザは存在しません
[root@ldap01 ~]# groupadd ldap
[root@ldap01 ~]# useradd -g ldap -s /bin/false ldap


起動する前に専用のldapユーザーを作成します。

[root@ldap01 ~]# cd /opt/openldap-2.4.44/
[root@ldap01 openldap-2.4.44]# ls -al
合計 40
drwxr-xr-x  10 root root 4096  3月 27 00:49 2016 .
drwxr-xr-x.  6 root root 4096  3月 27 00:49 2016 ..
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 bin
drwxr-xr-x   3 root root 4096  3月 27 00:49 2016 etc
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 include
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 lib
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 libexec
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 sbin
drwxr-xr-x   3 root root 4096  3月 27 00:49 2016 share
drwxr-xr-x   4 root root 4096  3月 27 00:49 2016 var

[root@ldap01 openldap-2.4.44]# chown root.ldap etc/openldap/slapd.conf
[root@ldap01 openldap-2.4.44]# chmod g+r etc/openldap/slapd.conf
[root@ldap01 openldap-2.4.44]# chown ldap.ldap -R var
[root@ldap01 openldap-2.4.44]# ls -al
合計 40
drwxr-xr-x  10 root root 4096  3月 27 00:49 2016 .
drwxr-xr-x.  6 root root 4096  3月 27 00:49 2016 ..
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 bin
drwxr-xr-x   3 root root 4096  3月 27 00:49 2016 etc
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 include
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 lib
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 libexec
drwxr-xr-x   2 root root 4096  3月 27 00:49 2016 sbin
drwxr-xr-x   3 root root 4096  3月 27 00:49 2016 share
drwxr-xr-x   4 ldap ldap 4096  3月 27 00:49 2016 var


作成したユーザーに対して、ファイルやフォルダの権限を与えます。

[root@ldap01 openldap-2.4.44]# vi ~/.bash_profile



export LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib


DBをソースからインストールした場合、環境変数LD_LIBRARY_PATHにDBライブラリのパスを指定します。

[root@ldap01 openldap-2.4.44]# cp -p var/openldap-data/DB_CONFIG.example var/openldap-data/DB_CONFIG
[root@ldap01 openldap-2.4.44]# ./sbin/slaptest -u
config file testing succeeded


openldap用DBの設定ファイルのサンプルファイルをコピーし、本ファイルとします。
そして、slaptestコマンドで、設定ファイルのテストを行ないます。
「succeeded」となることを確認します。

[root@ldap01 openldap-2.4.44]# ./libexec/slapd -u ldap
[root@ldap01 openldap-2.4.44]# ps -ef | grep [l]dap
ldap     32041     1  0 00:17 ?        00:00:00 ./libexec/slapd -u ldap


早速、openldapを起動します。

[root@ldap01 openldap-2.4.44]# ./bin/ldapsearch -x -h localhost -b dc=example,dc=com -LLL
No such object (32)


ldapsearchコマンドで、検索が行えることを確認します。

[root@ldap01 openldap-2.4.44]# kill -INT `cat var/run/slapd.pid`
[root@ldap01 openldap-2.4.44]# ps -ef | grep [l]dap
[root@ldap01 openldap-2.4.44]#


停止はkillコマンドで行ないます。

次回は実際にユーザーを作成したりをしたいと思います。

このページのトップヘ