★backend vsftpdサーバ×2

vi /etc/vsftpd/vsftpd.conf

pasv_enable=YES
pasv_min_port=60000
pasv_max_port=60001
pasv_address=lb.x.x.x

 

★frontend nginxサーバ

vi nginx.conf

stream {
#FTP
upstream ftp {
hash $remote_addr;
server vsftpd.nilesflow.net:21 weight=5 max_fails=3 fail_timeout=30s;
server aws-default.nilesflow.net:21 weight=5 max_fails=3 fail_timeout=30s;
# server pure-ftpd.nilesflow.net:10021 weight=5 max_fails=3 fail_timeout=30s;
}

server {
listen 20021;
proxy_connect_timeout 1s;
# proxy_timeout 3s;
proxy_pass ftp;
}

#FTP data
upstream ftpdata-v1 {
hash $remote_addr;
server vsftpd.nilesflow.net:60000 weight=5 max_fails=3 fail_timeout=30s;
server aws-default.nilesflow.net:60000 weight=5 max_fails=3 fail_timeout=30s;
}
upstream ftpdata-v2 {
server vsftpd.nilesflow.net:60001 weight=5 max_fails=3 fail_timeout=30s;
server aws-default.nilesflow.net:60001 weight=5 max_fails=3 fail_timeout=30s;
}

# vsftpd
server {
listen 60000;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass ftpdata-v1;
}
server {
listen 60001;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass ftpdata-v2;
}

 

★どこかのサーバから

ftp lb.nilesflow.net 20021

 

★補足

pasv_address= ドメイン名ではなくIPアドレス

vi /etc/vsftpd/vsftpd.conf

pasv_enable=YES
pasv_min_port=60000
pasv_max_port=60001
pasv_address=x.x.x.x

vi /etc/pure-ftpd/pure-ftpd.conf

Bind                            z.z.z.z,10021

PassivePortRange          60010 60011

ForcePassiveIP x.x.x.x

 

vi nginx.conf

stream {
#FTP
upstream ftp {
hash $remote_addr;
server z.z.z.z:21 weight=5 max_fails=3 fail_timeout=30s; #v
server z.z.z.z:10021 weight=5 max_fails=3 fail_timeout=30s; #p
}

server {
listen 20021;
proxy_connect_timeout 1s;
# proxy_timeout 3s;
proxy_pass ftp;
}

#FTP data
upstream ftpdata-v1 {
server z.z.z.z:60000 weight=5 max_fails=3 fail_timeout=30s;
}
upstream ftpdata-v2 {
server z.z.z.z:60001 weight=5 max_fails=3 fail_timeout=30s;
}
upstream ftpdata-p1 {
server z.z.z.z:60010 weight=5 max_fails=3 fail_timeout=30s;
}
upstream ftpdata-p2 {
server z.z.z.z:60011 weight=5 max_fails=3 fail_timeout=30s;
}

# vsftpd
server {
listen 60000;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass ftpdata-v1;
}
server {
listen 60001;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass ftpdata-v2;
}

# pure-ftpd
server {
listen 60010;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass ftpdata-p1;
}
server {
listen 60011;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass ftpdata-p2;
}

vi /etc/rsyslog.conf

 

http://unixservermemo.web.fc2.com/sv/pure-log.htm

yum install postfix

 

★postfixの設定

vi /etc/postfix/main.cf

myhostname = mail-dev.nilesflow.net

mydomain = nilesflow.net

myorigin = mail-dev.nilesflow.net

inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

local_recipient_maps =

mynetworks = 127.0.0.0/8, 192.168.1.0/24, x.x.x.x/32, y.y.y.y/32

relay_domains = $mydestination

virtual_alias_domains = mail-dev.nilesflow.net
virtual_alias_maps = hash:/etc/postfix/virtual

#home_mailbox = Mailbox
#home_mailbox = Maildir/

sendmail_path = /usr/sbin/sendmail

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_application_name = smtpd
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
#smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
~

★ヘッダ記録

smtpd_sasl_authenticated_header = yes

 

★sasl2の設定

889 adduser postfix sasl
890 id postfix
894 gpasswd -a postfix sasl

 

929 vi /etc/sasl2/smtpd.conf

pwcheck_method: saslauthd
mech_list: plain login

変更なしかな

933 vi /etc/sysconfig/saslauthd

SOCKETDIR=/var/run/saslauthd

MECH=pam

# DAEMONOPTS=–user saslauth

FLAGS=

変更なしかな
934 saslpasswd2 -u mail-dev.nilesflow.net -c nilesflow
935 sasldblistusers2

 

★エイリアスの設定

995 vi /etc/aliases

nilesflow: “|/usr/local/php-5.6.12/bin/php -f /var/tmp/php/recvmail.php”
997 newaliases

 

★バーチャルエイリアスの設定

1040  vi /etc/postfix/virtual

@mail-dev.nilesflow.net nilesflow@mail-dev.nilesflow.net

 

1046  postmap hash:/etc/postfix/virtual

 

★サブミッション

vi /etc/postfix/master.cf

submission inet n – n – – smtpd
#-o smtpd_tls_security_level=encrypt
#-o smtpd_sasl_auth_enable=yes
#-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

とりあえずSSLは使わないので

 

wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz

tar Jxvf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz

cp bin/wkhtmlto* /usr/local/bin/.

 

作ってみたが、文字が重なる・・・

http://dev.furoom.net/jsdoc3/jsdoc3/index.pdf

letter-spacingの問題っぽい。

オプションでも回避できなさそうな・・。残念。。

 

最新版入れてみる

1024 wget https://bitbucket.org/wkhtmltopdf/wkhtmltopdf/downloads/wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm
1026 tar Jxvf wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm
1027 rpm -ivh wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm
1028 yum install icu
1029 yum install xorg-x11-fonts-Type1
1030 yum install xorg-x11-fonts-75dpi
1031 rpm -ivh wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm

 

動かない。

wkhtmltopdf index.html index.pdf
QXcbConnection: Could not connect to display
アボートしました

 

yum install xorg-x11-server-Xvfb

xvfb-run wkhtmltopdf index.html index.pdf

できれいに表示された!

 

でも複数表示できない。

export QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb; xvfb-run wkhtmltopdf DomainSync.html DomainSync.js.ht
ml index.pdf
Error: This version of wkhtmltopdf is build against an unpatched version of QT, and does not support more then one input document.
Exit with code 1, due to unknown error.

 

stable 0.12.3 を使って、

letter-spacing を何とかするしかないのかも

 

–dpi 75 を着けると綺麗に表示された!

wkhtmltopdf –dpi 75 index.html  index.pdf

 

複数ファイル一気にかけようとするとエラーが発生する

wkhtmltopdf –dpi 75 *.html index.pdf
Loading pages (1/6)
Warning: Received createRequest signal on a disposed ResourceObject’s NetworkAccessManager. This might be an indication of an iframe taking too long to load.

 

–javascript-delay を付けると良いようだ

wkhtmltopdf –dpi 75 –javascript-delay 1000 *.html index.pdf

 

用紙幅が少なく感じるのは、

–page-size で調整すればよいのかな

http://stackoverflow.com/questions/6394905/wkhtmltopdf-what-paper-sizes-are-valid

 

A3 B3くらいがおさまりいい気がする

wkhtmltopdf –dpi 75 –javascript-delay 1000 –page-size B3 module-*.html index.pdf

 

–minimum-font-size

もあるけど、maxがない。文字大きくしたいのはそんなになさそう

 

jsdocの出力に対してかけたい。

.js.html はソースコードなのでとりあえず省く

index.htmlは最初におきたい

moduleは、moduleとclassで分けたい

wkhtmltopdf –dpi 75 –javascript-delay 1000 –page-size B3 index.html module*[^\.][^j][^s].html global.html index.pdf

 

classとmoduleがごちゃまぜなのでもう一息・・。

IAMユーザーでアクセスするには、

 

まず、アカウントから

https://console.aws.amazon.com/billing/home#/account

 

請求情報に対する IAM ユーザーアクセス

で、IAMアクセスのアクティブ化を行うこと。

 

そのあと、IAMポリシーをアタッチする。

AWSの説明ページ

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/mpuoverview.html

 

最少パートサイズ 5MB

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/qfacts.html

 

AWS-SDKで試してみたが、やっぱり駄目みたい。

AWS HTTP error: Client error: 400 EntityTooSmall (client): Your proposed upload is smaller than the minimum allowed size –
<Error>
<Code>EntityTooSmall</Code>
<Message>Your proposed upload is smaller than the minimum allowed size</Message>
<ProposedSize>4194304</ProposedSize>
<MinSizeAllowed>5242880</MinSizeAllowed>
<PartNumber>1</PartNumber>
<ETag>xxx</ETag>
<RequestId>xxx</RequestId>
<HostId>xxx=</HostId>
</Error>’

 

PHP + CURLは、MultipartUploadがなぜだかそもそもうまくいってない。

<?xml version=”1.0″ encoding=”UTF-8″?>
<Error>
<Code>RequestTimeout</Code>
<Message>Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed.</Message>
<RequestId>xxx</RequestId>
<HostId>xxx</HostId>
</Error>

 

★アップロード順番は順不同でも、completeMultipartUploadに渡す順序を正しく渡せばOK

$parts = array();

$partNumber = 2;
$file = fopen(‘awssdk-5MB-2’, ‘r’);
$result = $s3->uploadPart(array(
‘Bucket’ => $bucket,
‘Key’ => $keyname,
‘UploadId’ => $uploadId,
‘PartNumber’ => $partNumber,
‘Body’ => fread($file, 10 * 1024 * 1024),
));
fclose($file);

$parts[] = array(
‘PartNumber’ => $partNumber,
‘ETag’ => $result[‘ETag’],
);

$file = fopen(‘awssdk-5MB-1’, ‘r’);
$partNumber = 1;
$result = $s3->uploadPart(array(
‘Bucket’ => $bucket,
‘Key’ => $keyname,
‘UploadId’ => $uploadId,
‘PartNumber’ => $partNumber,
‘Body’ => fread($file, 10 * 1024 * 1024),
));
fclose($file);

$parts[] = array(
‘PartNumber’ => $partNumber,
‘ETag’ => $result[‘ETag’],
);

$parts = array_reverse($parts);

cd /usr/local/src/
wget “http://sourceforge.net/projects/s3tools/files/latest/download?source=files”
mv download\?source\=files s3cmd-1.6.0.tar.gz
tar xvzf s3cmd-1.6.0.tar.gz
cd s3cmd-1.6.0
yum install python-setuptools
python ./setup.py install
s3cmd

 

[nilesflow@tk2-234-26954 glusterfs]$ s3cmd –configure
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: xxx
Secret Key: yyy
Default Region [US]: us-west-2

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: zzz
Path to GPG program [/usr/bin/gpg]:

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]:

New settings:
Access Key: xxx
Secret Key: yyy
Default Region: us-west-2
Encryption password: zzz
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: True
HTTP Proxy server name:
HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] Y
Please wait, attempting to list all buckets…
Success. Your access key and secret key worked fine 🙂

Now verifying that encryption works…
Success. Encryption and decryption worked fine 🙂

Save settings? [y/N] y
Configuration saved to ‘/home/nilesflow/.s3cfg’

 

★PUT

[nilesflow@tk2-234-26954 s3cmd]$ s3cmd put s3cmd.txt s3://nilesflowfirstbucket
‘s3cmd.txt’ -> ‘s3://nilesflowfirstbucket/s3cmd.txt’ [1 of 1]
6 of 6 100% in 0s 72.27 B/s done
‘s3cmd.txt’ -> ‘s3://nilesflowfirstbucket/s3cmd.txt’ [1 of 1]
6 of 6 100% in 0s 42.13 B/s done

 

★マルチパートアップロード 50MB

[nilesflow@tk2-234-26954 s3cmd]$ dd if=/dev/zero of=s3cmd-50MB bs=50MB count=1
1+0 records in
1+0 records out
50000000 bytes (50 MB) copied, 0.191449 s, 261 MB/s
[nilesflow@tk2-234-26954 s3cmd]$ ll

[nilesflow@tk2-234-26954 s3cmd]$ s3cmd put –multipart-chunk-size-mb=5 s3cmd-50MB s3://nilesflowfirstbucket
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 1 of 10, 5MB]
5242880 of 5242880 100% in 0s 14.18 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 2 of 10, 5MB]
5242880 of 5242880 100% in 0s 14.37 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 3 of 10, 5MB]
5242880 of 5242880 100% in 0s 15.60 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 4 of 10, 5MB]
5242880 of 5242880 100% in 0s 12.77 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 5 of 10, 5MB]
5242880 of 5242880 100% in 0s 15.85 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 6 of 10, 5MB]
5242880 of 5242880 100% in 0s 15.12 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 7 of 10, 5MB]
5242880 of 5242880 100% in 0s 18.30 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 8 of 10, 5MB]
5242880 of 5242880 100% in 0s 10.19 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 9 of 10, 5MB]
5242880 of 5242880 100% in 0s 15.32 MB/s done
‘s3cmd-50MB’ -> ‘s3://nilesflowfirstbucket/s3cmd-50MB’ [part 10 of 10, 2MB]
2814080 of 2814080 100% in 0s 5.10 MB/s done

以前触ったけど、残してなかったので今の状態だけ。

 

yum install glusterfs glusterfs-fuse

yum install glusterfs glusterfs-server

 

service glusterd start

 

 

[root@tk2-234-26954 glusterfs]# gluster volume info

Volume Name: gfs
Type: Replicate
Volume ID: 6ae6cc45-59df-4d12-9307-35410214324d
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: primary.gfs.local:/root/glusterfs/primary
Brick2: secondary.gfs.local:/root/glusterfs/secondary
Options Reconfigured:
performance.readdir-ahead: on
[root@tk2-234-26954 glusterfs]# gluster volume status
Status of volume: gfs
Gluster process TCP Port RDMA Port Online Pid
——————————————————————————
Brick primary.gfs.local:/root/glusterfs/pri
mary 49156 0 Y 11647
Brick secondary.gfs.local:/root/glusterfs/s
econdary 49157 0 Y 11665
NFS Server on localhost N/A N/A N N/A
Self-heal Daemon on localhost N/A N/A Y 11697

Task Status of Volume gfs
——————————————————————————
There are no active volume tasks

 

mount

 

[root@tk2-234-26954 glusterfs]# df | grep -E “gfs|glusterfs”
primary.gfs.local:/gfs
18193792 8224512 9038464 48% /root/glusterfs/mount

 

touch /root/glusterfs/mount/7

#primary, secondary 両方にコピー

AWSを利用したクラウドWEBシステムの構築パターンがデザインパターンとして数多く掲載されている。

AWSの知識を深めるために手に取ったが、書かれているデザインパターンはAWSだけで用いられるものではなく、WEBシステム全般に対してのシステム設計レベルでのデザインパターンとも言える。

WEBシステムを構成するにあたりどのような点に気を付けるべきか、どのような技術が必要か、AWSに限らず理解していて全く損のない本。

そういう意味では、「Amazon Web Services~」となっていなければ、もっと万人にリーチできたのかも?とも思ってしまった。

「はじめに」のエピソードにもある通り、システム開発の現場では共通言語があると、単純なコミュニケーションから設計のレビューまで話が早いことが多い。

ここで用いられるデザインパターンが現場で一般言語として使われると良いなと思う。

 

一冊通しで読んだが、正直デザインパターン名が頭に馴染まない。なぜだろう。笑

GoFのデザインパターンはもう少し浸透しやすかった気がしたが・・。

という事で、何度か復習してみようと思う。

 

あと、コーチャンフォーで間違って実装ガイドの方を買ってしまったので、そっちも読んでみよう。