こんにちわ。能年玲奈より川口春菜派のとおのぶです。能年さんを画像検索すると剛力さんが現れてちょっとびっくりしました。 blogで利用してる画像はAmazon S3にあるんですが、どこからでも見ることができる状態でした。セキュリティ としてイヤだなと思っていたので、S3へRESTで認証することにしました。認証はNginxで行います。 やろうとしていることはnginxでS3へリバースプロキシ と同じで、S3の認証が異なるぐらいです。

REST認証

RESTで認証する3rd party modleのAWS proxy moduleあるので それを使います。3rd party moduleなのでgithubから落として組み込まないといけないのがめんどうなのと、設定例で ちょっとはまってしまいました。

インストールオプションでAWS proxy moduleを組み込みます。ansibleを使った例はこちらです。

./configure
--add-module={{ src }}/ngx_aws_auth

次に設定です。これでちょっとはまりました。githubの例では以下のとおりでしたが、動作せず認証エラーがおきます。

# This is an example that does not use the server root for the proxy root
location /myfiles {
    proxy_pass http://your_s3_bucket.s3.amazonaws.com/;

    aws_access_key your_aws_access_key;
    aws_secret_key the_secret_associated_with_the_above_access_key;
    s3_bucket your_s3_bucket;
    chop_prefix /myfiles; # Take out this part of the URL before signing it, since '/myfiles' will not be part of the URI sent to Amazon  


    proxy_set_header Authorization $s3_auth_token;
    proxy_set_header x-amz-date $aws_date;

動作させるには、locationのディレクトリに、/を加えるだけです。これだけです。 ansibleを使った例はこちらです。 ちなみに、chop_prefixに/がいらないのは、 ngx_http_aws_auth.c をみればわかります。

# This is an example that does not use the server root for the proxy root
location /myfiles/ { # you need "/".
    proxy_pass http://your_s3_bucket.s3.amazonaws.com/; #you need "/"

    aws_access_key your_aws_access_key;
    aws_secret_key the_secret_associated_with_the_above_access_key;
    s3_bucket your_s3_bucket;
    chop_prefix /myfiles; # you don't need "/".  


    proxy_set_header Authorization $s3_auth_token;
    proxy_set_header x-amz-date $aws_date;

以上で、s3に認証することができました。簡単でしたね。

NginxでdebugとPythonで認証

簡単に書きましたが設定ではまって認証エラーがずっとでてました。何を試してもエラーだったので、 pythonで認証させて、NginxでdebugしてSignitureと同じかどうかを試しました。記録として残します。

pythonの認証はS3のドキュメントにも のっていて、それに時刻の計算とS3に認証するところまで記しています。requestsに依存しています。

Nginxのdebugはインストールオプションの設定と設定ファイルでログレベルを修正する必要があります。 ansibleを使った例はこちらこちらです。

./configure
----with-debug
error_log logs/error.log debug;

これでエラーログが出るようになりました。例えば、 このようなものがあるとエラーログが出力されます。 これでpythonで認証したsignitureとnginxで認証したsignitureを比較することができました。

Read and Post Comments

こんにちわ。やや肌寒くなってきました。とおのぶです。なんとなくNginxでHttpImageFilterModuleを 使いたいなと思ってました。だけど、Nginxをソースからビルドしなくちゃいけないし、GDライブラリを インストールしなくちゃいけなくて面倒くさそうだったので億劫になってました。そんなところに 現れたのが、構成管理ツールのansibleです。python製で楽そうだったので、試してみました。

ansibleがまったくわかれなければ

わかりやすい説明を読みましょう。最初に Deploying with Vagrant and Ansible by yeukhon のスライドを見て、Ansible Tutorialをやるのが適当 だと思います。ansibleだけ使いたいのでvagrantやserverspecのところはやる必要はありません。(やった方が いいですが)

補足資料

環境

mac book airのansibleからCentOS 6.2へ操作します。

要件

  • yumでGDライブラリをインストールすること
  • 各バージョンごとにインストールできること(インストール先が異なる)
  • わかりやすくオプションを設定できること(マルチラインで書けること)
  • テンプレートからnginx.confをコピーできること
  • テンプレートから自動起動スクリプトをコピーできること
  • 自動起動スクリプトをサービスへ設定できること

playbookの内容

varsとtaskを要件ごとに説明します。gistに全ファイルを あげているので、こちらをざっくりみてください。

varsについて

ご覧のとおりです。srcは、ダウンロード先ですね。

vars:
  version: "nginx-1.5.x"
  src: 'DOWNLOAD_PATH'
  install_path: 'INSTALL_PATH'

yumでGDライブラリをインストールすること

with_itemsがリストっぽく書けるので、それをyumモジュールと組み合わせます。

- name: "be sure gd package for image_filter_module of nginx"
  yum: name={{ item }} state=installed
  with_items:
   - gd
   - gd-devel

各バージョンごとにインストールできること(インストール先が異なる), わかりやすくオプションを設定できること(マルチラインで書けること)

get_urlモジュールを使ってソースをバージョンごとにダウンロードします。ファイルがあれば、 スキップします。

- name: "get source"
  get_url: url=http://nginx.org/download/{{ version }}.tar.gz dest={{ src }}

ダウンロード先へcdして、tar コマンドで解凍します。ファイルがあればスキップします。

- name: "expand source"
  command: tar xvfz {{ version }}.tar.gz chdir={{ src }} creates={{ src }}/{{ version }}

install_pathとversionの変数を利用して、インストール先をバージョンごとで変更します。 >を使うことで、 マルチラインで書くことができます。必要になったモジュールを足せばいい状態にしておきます。マルチラインで 書く方法は、他にもある。

- name: "configure source"
  command: > 
          ./configure
          --prefix={{ install_path }}/{{ version }}
          --with-http_image_filter_module
          --with-http_ssl_module
          chdir={{ src }}/{{ version }}

make

- name: "make"
  command: make chdir={{ src }}/{{ version }}

make install

- name: "make install"
  command: make install chdir={{ src }}/{{ version }

テンプレートからnginx.confをコピーできること

templateモジュールを使ってnginx.confをコピーします。

- name: "copy nginx.conf"
  template: src=template/nginx.conf.j2 dest={{ install_path }}/{{ version }}/conf/nginx.conf 

テンプレートから自動起動スクリプトをコピーできること

templateモジュールを使ってコピーします。アクセス権も変更します。

- name: "copy nginx for init.d"
  template: src=template/nginx_init.j2 dest=/etc/init.d/{{ version }} mode=0755

自動起動スクリプトをサービスへ設定できること

chkconfigで登録します。

- name: "resister service  "
  command: chkconfig --add {{ version }}

感想

エラー内容をみたい

エラー内容が通常見れません。-vvvをつけることで、詳細を見ることができます。sudoで 入力待ちになってたにもかかわらず、気付けませんでした。hangしている状態に見えていました。

suは使わない

sudoは使えますが、suは使わない。そういう思想っぽいです。

パスワード付きで処理したい

パスワード付きで実行することは少ないと思いますが、最初のrootでパスワード発行されたときに 必要です。sshpassが必要なので別途インストールする必要があります。

Read and Post Comments

nginxでspdyを試す01の続きです。 SSL証明書をインストールするところから始めます。

SSL証明書をインストール

SSL証明書は、Rapid-ssl.jpで購入しました。2600円でした。

# csrを作ります。
openssl req -new -newkey rsa:2048 -nodes -keyout YOUR_DOMAIN.key -out YOUR_DOMAIN.csr

# crtを受け取って、中間証明書と連結する
# メールできてるはず。
cat YOUR_DOMAIN.crt bundle.crt > YOUR_DOMAIN-join.crt

# nginx配下におきます。
cp YOUR_DOMAIN.key /usr/local/nginx/ssl/
cp YOUR_DOMAIN-join.crt /usr/local/nginx/ssl/

nginx.confの設定

/etc/init.d/nginxspdy の設定

名前は、nginxspdyで統一します。

serviceの登録

chkconfig --add nginxspdy

参考サイト

Read and Post Comments

nginxでspdyを試したい!だけど、現状動作しているものは、いじりたくない。。。
ec2で動作検証すればいいんでしょうが。。。

  • 今、動いているのは、rpmからインストールしたもの
  • tar.gzからインストールすれば、別々のところにインストール可能

というわけで、tar.gzからインストールしていきます。 今回は、OpenSSLのインストールからmake installするところまでです。

OpenSSLの1.0.1以上をインストールする

今の状態

~/package  ᐅ rpm -qa | grep release
remi-release-6-1.el6.remi.noarch
epel-release-6-5.noarch                      
centos-release-6-2.el6.centos.7.x86_64       
nginx-release-centos-6-0.el6.ngx.noarch 

IUS reposからインストールすることができるので、登録する。

~/package  ᐅ wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/ius-release-1.0-10.ius.el6.noarch.rpm   
~/package  ᐅ wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/yum-plugin-replace-0.2.5-1.ius.el6.noarch.rpm

~/package  ᐅ sudo rpm -Uvh ius-release-1.0-10.ius.el6.noarch.rpm
~/package  ᐅ sudo rpm -Uvh yum-plugin-replace-0.2.5-1.ius.el6.noarch.rpm

今のopenssl

~/package  ᐅ rpm -qi openssl
Name        : openssl                      Relocations: (not relocatable) 
Version     : 1.0.0                             Vendor: CentOS 
Release     : 25.el6_3.1                    Build Date: 2012年08月23日 14時01分06秒 
Install Date: 2012年09月30日 23時54分08秒      Build Host: c6b7.bsys.dev.centos.org 
Group       : System Environment/Libraries   Source RPM: openssl-1.0.0-25.el6_3.1.src.rpm 
Size        : 3768415                          License: OpenSSL                           
Signature   : RSA/SHA1, 2012年08月23日 21時31分38秒, Key ID 0946fca2c105b9de              
Packager    : CentOS BuildSystem <http://bugs.centos.org>                                 
URL         : http://www.openssl.org/                                                     
Summary     : A general purpose cryptography library with TLS implementation

~/package  ᐅ rpm -qi openssl-devel 
Name        : openssl-devel                Relocations: (not relocatable) 
Version     : 1.0.0                             Vendor: CentOS 
Release     : 25.el6_3.1                    Build Date: 2012年08月23日 14時01分06秒 
Install Date: 2012年09月30日 23時54分10秒      Build Host: c6b7.bsys.dev.centos.org 
Group       : Development/Libraries         Source RPM: openssl-1.0.0-25.el6_3.1.src.rpm 
Size        : 2161501                          License: OpenSSL 
Signature   : RSA/SHA1, 2012年08月23日 21時31分38秒, Key ID 0946fca2c105b9de 
Packager    : CentOS BuildSystem <http://bugs.centos.org> 
URL         : http://www.openssl.org/ 
Summary     : Files for development of applications which will use OpenSSL

インストール

~/package  ᐅ sudo yum replace openssl --replace-with=openssl10 --enablerepo=ius-testing

Loaded plugins: fastestmirror, replace, security 
Loading mirror speeds from cached hostfile 
 * epel: ftp.iij.ad.jp 
 * ius: ftp.neowiz.com 
 * ius-testing: ftp.neowiz.com 
Replacing packages takes time, please be patient... 

WARNING: Unable to resolve all providers: ['config(openssl)', 'openssl(x86-64)', 'openssl-devel(x86-64)'] 

This may be normal depending on the package.  Continue? [y/N] y 
Resolving Dependencies 
--> Running transaction check 
---> Package openssl.x86_64 0:1.0.0-25.el6_3.1 will be erased 
---> Package openssl-devel.x86_64 0:1.0.0-25.el6_3.1 will be erased 
---> Package openssl10.x86_64 0:1.0.1c-10.ius.el6 will be installed 
---> Package openssl10-devel.x86_64 0:1.0.1c-10.ius.el6 will be installed 
---> Package openssl10-libs.x86_64 0:1.0.1c-10.ius.el6 will be installed 
--> Finished Dependency Resolution 

Dependencies Resolved 

=================================================================================================== Package                  Arch            Version                       Repository            Size 
===================================================================================================Installing: 
 openssl10                x86_64          1.0.1c-10.ius.el6             ius-testing          663 k 
 openssl10-devel          x86_64          1.0.1c-10.ius.el6             ius-testing          1.1 M 
 openssl10-libs           x86_64          1.0.1c-10.ius.el6             ius-testing          806 k 
Removing: 
 openssl                  x86_64          1.0.0-25.el6_3.1              @updates             3.6 M 
 openssl-devel            x86_64          1.0.0-25.el6_3.1              @updates             2.1 M 

Transaction Summary 
===================================================================================================
Install       3 Package(s) 
Remove        2 Package(s) 

Total download size: 2.6 M 

---------------------------------------------

確認

~/package  ᐅ rpm -qi openssl10 
Name        : openssl10                    Relocations: (not relocatable)
Version     : 1.0.1c                            Vendor: (none)
Release     : 10.ius.el6                    Build Date: 2013年01月09日 04時58分55秒
Install Date: 2013年02月03日 02時57分28秒      Build Host: 339189-build03.rpmdev.rackspace.com
Group       : System Environment/Libraries   Source RPM: openssl10-1.0.1c-10.ius.el6.src.rpm
Size        : 1588038                          License: OpenSSL
Signature   : DSA/SHA1, 2013年01月09日 14時07分52秒, Key ID da221cdf9cd4953f
URL         : http://www.openssl.org/
Summary     : Utilities from the general purpose cryptography library with TLS implementation

~/package  ᐅ rpm -qi openssl10-devel
Name        : openssl10-devel              Relocations: (not relocatable)
Version     : 1.0.1c                            Vendor: (none)
Release     : 10.ius.el6                    Build Date: 2013年01月09日 04時58分55秒
Install Date: 2013年02月03日 02時57分27秒      Build Host: 339189-build03.rpmdev.rackspace.com
Group       : Development/Libraries         Source RPM: openssl10-1.0.1c-10.ius.el6.src.rpm
Size        : 2226493                          License: OpenSSL
Signature   : DSA/SHA1, 2013年01月09日 14時07分51秒, Key ID da221cdf9cd4953f
URL         : http://www.openssl.org/
Summary     : Files for development of applications which will use OpenSSL

nginxをインストールする

~/package  ᐅ wget http://nginx.org/download/nginx-1.3.11.tar.gz
~/package  ᐅ tar xvfz nginx-1.3.11.tar.gz
~/package  ᐅ cd nginx-1.3.11

# patchをおとしてあてる
~/package/nginx-1.3.11  ᐅ wget http://nginx.org/patches/spdy/patch.spdy.txt
~/package/nginx-1.3.11  ᐅ patch -p1 < patch.spdy.txt

# cofigure make make install
~/package/nginx-1.3.11  ᐅ ./configure --with-http_ssl_module --with-http_spdy_module

hecking for getaddrinfo() ... found
checking for PCRE library ... not found
checking for PCRE library in /usr/local/ ... not found
checking for PCRE library in /usr/include/pcre/ ... not found
checking for PCRE library in /usr/pkg/ ... not found
checking for PCRE library in /opt/local/ ... not found

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

# エラーが出た!
# pcre-develをインストールしてみる。
~/package/nginx-1.3.11  ᐅ sudo yum install pcre-devel
# ログ取ってないけど、成功しました。

~/package/nginx-1.3.11  ᐅ sudo paco -D make install

nginxでspdyを試す02へ続きます。

Read and Post Comments

Todo:タイトルがあきらかにおかしい。

やりたいこと

http://192.168.0.1:5001/myapp ←これを
http://example.com/myprefix/myapp ←これで動かしたい。
myappのscriptを一切変更せずに。(url_forの挙動がよくわからなかったんですよ。)

プロキシー

イカ娘ちゃんは、言った。プロキシーを作ればいいじゃなイカ!ほんとは、flask.pocoo.org/snippets/35/の真似しただけです。

nginxの設定

location /myprefix/ {     
    include uwsgi_params;     
    if ($uri ~ ^/myprefix(.*)?) {    
        set $path_url $1;     
    }    
    uwsgi_param SCRIPT_NAME /myprefix; 
    uwsgi_pass  0.0.0.0:5001;    
    uwsgi_param X-Script-Name /myprefix;    
    uwsgi_param X-Scheme $scheme;     
}

reverseProxy

class ReverseProxied(object):
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        script_name = environ.get('X-Script-Name', '')
        if script_name:
            path_info = environ['PATH_INFO']
            if path_info.startswith(script_name):
                environ['PATH_INFO'] = path_info[len(script_name):]
        scheme = environ.get('X-Scheme', '')
        if scheme:
            environ['wsgi.url_scheme'] = scheme
        return self.app(environ, start_response)

done

nginxをreloadして、myappにReverseProxyを組み込んで、uwsgi起動しておしまい。headerとか、X-が何を意味するのかわかってないので、調べたいと思います(・∀・)v

Read and Post Comments

Next Page »