オラクる。

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

2016年03月

ロードバランスの色んなオプションを確認します。
それぞれ、nginx.confのupstreamディレクトリブをいじっています。

    upstream backend {
       server 192.168.200.2:80 ;
       server 192.168.200.3:80 ;
    }

[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx03
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx03
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx03

まずはデフォルトはラウンドロビンなので、順番にそれぞれのホストに接続します。

    upstream backend {
       server 192.168.200.2:80 weight=3;
       server 192.168.200.3:80 ;
    }

[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx03
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx03

weightオプションを着けると、サーバーに重み付けされます。
重み付けされたサーバに優先的に接続します。
デフォルトは1、重みが無い状態です。

    upstream backend {
       server 192.168.200.2:80 ;
       server 192.168.200.3:80 down;
    }

[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02


また、downオプションを着けると、そのサーバーは接続されません。

    upstream backend {
       server 192.168.200.2:80 ;
       server 192.168.200.3:80 backup;
    }

[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# ssh 192.168.200.2
root@192.168.200.2's password:
Last login: Thu Mar 17 00:26:02 2016 from 192.168.200.1
[root@nginx02 ~]# service nginx stop
nginx を停止中:                                            [  OK  ]
[root@nginx02 ~]# exit
logout
Connection to 192.168.200.2 closed.
[root@nginx01 ~]# curl http://localhost/test.html
nginx03
[root@nginx01 ~]# curl http://localhost/test.html
nginx03

backupオプションは、backup以外のサーバーがダウンしている時にのみ接続されます。

    upstream backend {
       ip_hash ;
       server 192.168.200.2:80 ;
       server 192.168.200.3:80 ;
    }

[root@nginx01 ~]# curl http://localhost/test.html
nginx02
[root@nginx01 ~]# curl http://localhost/test.html
nginx02

ip_hashオプションを着けると、同じIPのクライアントは必ず同じサーバーに繋がるようになります。

Nginxのウリの機能の1つ、「ロードバランサー」機能を検証してみます。
今回はこんな3ホストの構成です。

host名:nginx01
IP:172.17.9.195(front)
192.168.200.1(back)

host名:nginx02
IP:192.168.200.2(back)

host名:nginx03
IP:192.168.200.3(back)


クライアントがnginx01のfrontにアクセスするとbackを経由して、nginx02、nginx03にロードバランスされます。
まずはback側を設定します。

[root@nginx02 ~]# less /etc/nginx/nginx.conf



    server {
        listen       80;
        server_name  localhost;

        location / {
            root html;
            index index.html index.htm;
        }
   }


シンプルに80番ポートで待ち受ける設定を行ないます。
backの2ホストで同様の設定を行ないます。
続いてfront側の設定です。

[root@nginx01 ~]# less /etc/nginx/nginx.conf



http {
    include       mime.types;
    default_type  application/octet-stream;


    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;
    access_log  /var/log/nginx/access.log  main;

ログのフォーマットを設定します。
$http_x_forwarded_forにはプロクシの接続元情報が入ります。
これを確認することでプロクシを経由してきた、クライアントのIPアドレスがわかります。

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        proxy_set_header Host            $host;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;

        location / {
            proxy_pass http://backend;
        }


プロキシサーバとして、次に渡すべき情報をセットします。
リモートのIPアドレスも入れています。
また、backendというサーバーのプールにproxyされる設定も行ないます。

    upstream backend {
       server 192.168.200.2:80 weight=3;
       server 192.168.200.3:80 ;
    }

さらに、プールの設定も行ないます。
アクセス先のサーバーのIPアドレスを記載します。
アドレスが複数ある場合は一定の規則に従い、ロードバランスされます

これでfront側の設定は終わりです。
早速、サービスを再起動して、ロードバランスを確認しましょう。
今回はbackendに、それぞれが同名のファイル名のテストファイルを置きました。
中身は違うので、それを見ることで、どこのホストにアクセスしているかが判明します。

~つづく~

前回まででopensslをインストールしたので、今回は自己署名の証明書を作り、nginxのサイトに割当てます。

[root@nginx01 ~]# openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key
Generating a 2048 bit RSA private key
...+++
......................+++
writing new private key to '/etc/nginx/ssl/nginx.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:


まずは、自己署名の証明書です。
証明書の保管先と、キーの保管先を指定する必要があります。
この保管先を後ほど指定します。

[root@nginx01 ~]# less /etc/nginx/nginx.conf



    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      /etc/nginx/ssl/nginx.pem;
        ssl_certificate_key  /etc/nginx/ssl/nginx.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }


Nginxの設定です。
SSLの443番ポートで待ち受け、SSLの証明書とキーを指定します。

[root@nginx01 ~]# service nginx restart
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx を停止中:                                            [  OK  ]
nginx を起動中:   
                                         [  OK  ]

設定後、サービスを再起動します。

安全ではない接続

「https://」でアクセスしてみました。
自己署名なので、警告が出力されますが・・・

Welcome to nginx!

しっかりとアクセスすることが出来ました。

Nginxを利用して、httpsなサイトを作成する手順を確認します。
証明書のインターフェースにはopensslを利用します。

[root@nginx01 openssl]# wget https://www.openssl.org/source/openssl-1.0.2g.tar.gz
--2016-03-10 14:34:12--  https://www.openssl.org/source/openssl-1.0.2g.tar.gz
www.openssl.org をDNSに問いあわせています... 194.97.150.234, 2001:608:c00:180::1:ea
www.openssl.org|194.97.150.234|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 5266102 (5.0M) [application/x-gzip]
`openssl-1.0.2g.tar.gz' に保存中

100%[======================================>] 5,266,102   1.03M/s 時間 4.9s

2016-03-10 14:34:18 (1.03 MB/s) - `openssl-1.0.2g.tar.gz' へ保存完了 [5266102/5266102]

[root@nginx01 openssl]# tar zxvf openssl-1.0.2g.tar.gz


opensslの最新版をダウンロードし、展開します。

[root@nginx01 openssl-1.0.2g]# ./config shared zlib --prefix=/opt/openssl

[root@nginx01 openssl-1.0.2g]# make && make install

[root@nginx01 ~]# vi .bash_profile



PATH=$PATH:$HOME/bin:/opt/python/bin:/opt/openssl/bin


コンパイル、インストールして、パスを通します。

[root@nginx01 ~]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013


versionパラメーターでopensslのバージョンを確認します。
古い場合は、標準のモジュールを見ているためです。

[root@nginx01 ~]# mv /usr/bin/openssl /usr/bin/openssl.bak
[root@nginx01 ~]# ln -s /opt/openssl/bin/openssl /usr/bin/openssl
[root@nginx01 ~]# openssl version
OpenSSL 1.0.2g  1 Mar 2016


標準のopensslをリネームし、新しいopensslのシンボリックリンクを作成します。
これで、新しいバージョンが表示されるようになります。

今回はuwsgiをインターフェースとして、nginxからpythonを実行してみます。

[root@nginx01 bin]# python -V
Python 3.5.1

[root@nginx01 ~]# cat .bash_profile



PATH=$PATH:$HOME/bin:/opt/python/bin

export PATH
export PYTHONHOME=/opt/python

pythonはインストール済の環境です。
環境変数も設定済です。

[root@nginx01 ~]# pip install uwsgi
Collecting uwsgi
  Downloading uwsgi-2.0.12.tar.gz (784kB)
    100% |????????????????????????????????| 786kB 529kB/s
Installing collected packages: uwsgi
  Running setup.py install for uwsgi
Successfully installed uwsgi-2.0.12


pipを利用してuwsgiをインストールします。

[root@nginx01 ~]# cat hello.py
# hello.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]


helloスクリプトを作成します。

[root@nginx01 ~]# uwsgi --http :9090 --wsgi-file hello.py
*** Starting uWSGI 2.0.12 (64bit) on [Wed Mar  9 19:37:49 2016] ***
compiled with version: 4.4.7 20120313 (Red Hat 4.4.7-16) on 09 March 2016 00:48:00
os: Linux-2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 EDT 2015
nodename: nginx01
machine: x86_64
clock source: unix
pcre jit disabled




まずは、uwsgiを利用して9090をhttpで待ち受けます。

1

ブラウザから9090にアクセスするとスクリプトが実行されます。

[root@nginx01 ~]# uwsgi --master --close-on-exec \
>   --socket 127.0.0.1:9090  \
>   --processes 2 \
>   --pidfile /var/log/uwsgi.pid \
>   --wsgi-file hello.py \
>   --daemonize /var/log/uwsgi.log


続いて9090をソケットで待ち受けます。

[root@nginx01 ~]vi /etc/nginx/nginx.conf



        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:9090;
        }


nginx側で9090に転送する設定をします。

2

nginx側のポートでスクリプトが実行されることが確認できました。

このページのトップヘ