tmp
Monday, November 26, 2018
UnicodeDecodeError on python3.5
自動アップデートのタイミングでか ubuntu16.04 上の python で以下のエラーが出たので対応 ``` File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode return codecs.ascii_decode(input, self.errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 239: ordinal not in range(128) ``` 日本語の入出力周りで出ているっぽい `/etc/default/locale` に以下を追加して fix ``` LANG="en_US.UTF-8" LC_CTYPE="en_US.UTF-8" # <-- Add ``` or ``` sudo update-locale LC_CTYPE=en_US.UTF-8 ```
Wednesday, November 21, 2018
nginx memo
### package 基本は `nginx` 、lua を使いたい場合は `nginx-extras` * http://blog.it.churaumi.tv/nginx-light-full-extra-configure-compare ### config file path 設定ファイルを置く場所について サイト設定 `server` は `conf.d` に入れてもいいけど 区別のために `sites-available` に置いて `sites-enabled` に symlink 貼った方が良さげ lua ファイルは特に決まってないっぽいので `/etc/nginx/lua/` とかで あとは基本的に↓ * https://gakumon.tech/nginx/nginx_conf_directory.html ### content cache #### multi server 1台でキャッシュを扱う場合は特に何も考えなくていい redis, memcached 等のストレージを利用するケースだとモジュールが用意されているがキャッシュの設定はアプリケーションで行わないといけない様なのでちょっと微妙 ``` A response should be put in memcached in advance by means external to nginx. ``` * http://nginx.org/en/docs/http/ngx_http_memcached_module.html ``` The backend should set the data in redis. The redis key is /uri?args. ``` * https://www.nginx.com/resources/wiki/modules/redis/ * https://www.nginx.com/resources/wiki/modules/redis2/ ローカルキャッシュを利用する場合は下記の様な構成にするとうまくいく (`sharded cache` or `shared cache`) * https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ #### purge cache nginx plus(有償) だと proxy_cache_purge module が提供されている 無料版だと * [Cache Purge](https://github.com/FRiCKLE/ngx_cache_purge) * [Selective Cache Purge](https://github.com/wandenberg/nginx-selective-cache-purge-module) ここら辺が使えそう(ただしnginxをソースからビルドしないといけないっぽいのでメンテとか考えると面倒そう) または lua で自力でやる場合は * https://scene-si.org/2016/11/02/purging-cached-items-from-nginx-with-lua/ * https://scene-si.org/2017/01/08/improving-nginx-lua-cache-purge/ ただし `proxy_cache_key` を指定しても key が揺らぐ(Vary, set-cookie とかで)みたいなのでそこら辺気にしないと確実に消せない デバイス別にキャッシュした場合も考慮する必要あり ``` proxy_ignore_headers Cache-Control Expires Set-Cookie Vary; proxy_hide_header Set-Cookie; ``` example * https://gist.github.com/fiahfy/a9d5ccbbe716286fe1b1ec71a65f1489 ### proxy_set_header location でheaderを追加したい時とかにそのまま追加だとうまくいかないのでいちいち全て再設定する必要がある `bad` ``` server { : proxy_set_header Host $host; : location / { proxy_set_header X-Foo 'foo'; } ``` `good` ``` server { : proxy_set_header Host $host; : location / { proxy_set_header Host $host; proxy_set_header X-Foo 'foo'; } ``` ### template #### log ``` log_format ltsv 'host:$http_host\t' 'port:$server_port\t' 'time:$time_iso8601\t' 'remote_addr:$remote_addr\t' 'request_method:$request_method\t' 'request_length:$request_length\t' 'request_uri:$request_uri\t' 'https:$https\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; error_log /var/log/nginx/error.log; ``` #### proxy cache ``` proxy_cache_path /var/cache/nginx/app levels=1:2 keys_zone=app:8m inactive=10m max_size=128m; proxy_temp_path /var/cache/nginx/tmp; ``` #### map ``` map $http_user_agent $mobile { default 0; ~iPhone 1; ~Android 1; ~BlackBerry 1; } ``` #### ssl ``` ssl_protocols TLSv1.2; ssl_prefer_server_ciphers on; ssl_certificate /etc/ssl/certs/site.pem; ssl_certificate_key /etc/ssl/private/site.key; ```
Thursday, November 1, 2018
fs performance (sync vs async)
```js const fs = require('fs') const path = require('path') const util = require('util') const calcSync = (filepath) => { const stats = fs.lstatSync(filepath) if (!stats.isDirectory()) { return [1, stats.size] } let totalNum = 0 let totalSize = 0 const filenames = fs.readdirSync(filepath) for (let filename of filenames) { const [num, size] = calcSync(path.join(filepath, filename)) totalNum += num totalSize += size } return [totalNum, totalSize] } const calc = async (filepath) => { const stats = await util.promisify(fs.lstat)(filepath) if (!stats.isDirectory()) { return [1, stats.size] } let totalNum = 0 let totalSize = 0 const filenames = await util.promisify(fs.readdir)(filepath) for (let filename of filenames) { const [num, size] = await calc(path.join(filepath, filename)) totalNum += num totalSize += size } return [totalNum, totalSize] } const src = '
' ;(async () => { console.time('calcSync') console.log(calcSync(src)) console.timeEnd('calcSync') console.time('calc') const r = await calc(src) console.log(r) console.timeEnd('calc') })() ``` ``` [ 23723, 359622209 ] calcSync: 352.919ms [ 23723, 359622209 ] calc: 1406.648ms ```
Newer Posts
Older Posts
Home
Subscribe to:
Posts (Atom)