【メモ】【nginx】nginxでロードバランス先を出力する

nginxでロードバランスを行った際、
デフォルトの設定ではアクセスログにロードバランス先が出力されない。

ロードバランス先の出力方法を調べてみると、以下の記事が参考になったのでメモとして残しておく。
yapud.hatenablog.com

修正内容は以下の通りになります。
ポイントは、nginx.confでは複数のログフォーマットをそれぞれ別名で定義できること。

下記の場合だと、nginx宛のアクセスログのフォーマットを「main 」、
ロードバランス先のアクセスログのフォーマットを「upstreamlog」という名称で定義しています。

※まだ検証途中なので、nginxとロードバランス先のサーバーは同じインスタンスで動かしています。

worker_processes 1;

events {
        worker_connections 1024;
}

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" '
        access_log /var/log/nginx/access.log main;
        
        # 追記したログフォーマット
        log_format upstreamlog '[$time_local] $remote_addr $host $upstream_addr $request';
        access_log /var/log/nginx/upstream.log upstreamlog;

        upstream backends {
                keepalive 32;
                server 127.0.0.1:8080;

        }

        server {
                listen 80;
                server_name www.example.com;

                location / {
                        proxy_http_version 1.1;
                        proxy_set_header Connection "";
                        proxy_set_header Host $http_host;

                        proxy_pass http://backends;
                }
        }
}

以上。

【メモ】【勉強】EC2にnginxをインストール

下記コマンドでnginxをインストールする。

$ amazon-linux-extras | grep "nginx" 
38 nginx1 available [ =stable ] 

$ sudo amazon-linux-extras install nginx1
Installing nginx Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-kernel-5.10 amzn2extra-nginx1 0 metadata files removed
略


インストール後、下記コマンドでnginxを起動。

$ sudo systemctl start nginx

下記コマンドでEC2起動時に自動的にnginxを起動するように設定。

$ sudo systemctl start nginx

下記コマンドでStatusを確認。

$ systemctl status nginx
 ● nginx.service - The nginx HTTP and reverse proxy server Loaded
略

EC2のパブリックIPにブラウザからアクセスして確認。

f:id:huji_mori:20211228225027p:plain
ブラウザでnginxの起動を確認

【メモ】WslRegisterDistribution failed with error: 0x800701bc

WSLインストール時に発生したエラーについてメモ。

新しく組んだデスクトップPCにWSLをインストールしようとしたら、以下のようなエラーが発生した。

stalling, this may take a few minutes...
WslRegisterDistribution failed with error: 0x800701bc
Error: 0x800701bc WSL 2 ???????????? ??????????????????????? https://aka.ms/wsl2kernel ?????????

Press any key to continue...

調べてみると、Linux カーネル更新プログラム パッケージをダウンロードする必要がある模様。
docs.microsoft.com

指示に従い、Linuxカーネル更新プログラムパッケージをダウンロード&インストール。
その後、無事インストールが完了した。

Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: hujimori
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Dec 28 21:11:44 JST 2021

  System load:  0.07               Processes:             8
  Usage of /:   0.5% of 250.98GB   Users logged in:       0
  Memory usage: 0%                 IPv4 address for eth0: 172.20.128.7
  Swap usage:   0%

1 update can be applied immediately.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once a day. To disable it please create the
/home/hujimori/.hushlogin file.

go1.16で「no required module provides package~」が出たときの対処方法

go1.16でコードを書いてビルドすると以下のメッセージが出た

no required module provides package

go1.16からgo.modやgo.sumが自動でビルド時に更新されないので、以下のコマンドを対象のファイルがある場所で実行すれば解消される。

$ go mod tidy

ここ約半年間で読んだ本を紹介してみる

はじめに

気が向いたので、2021年に入ってから自分が読んだ本を紹介してみようかと思います。

読んだ時期が古いものから順に紹介していきます。

(古いものほど、記憶の解像度が怪しいので内容も朧気です。) 

 

2021年1月~4月

まずは1月~4月に読んだ本を紹介していきます。

冬は寒さで脳が悴み、ありとあらゆる物事に対して気力が無くなりがちになります。

この時期は心に関する本を読んでいました。

無気力なのにはワケがある 心理学が導く克服のヒント

 無気力状態を抜け出すヒントを得るためにこの本を読みました。

この本では、実験を通して科学的に検証を進めることで、人がなぜ無気力になるのか、どのようにして無気力になるのか、無気力が自身にもたらす影響について述べています。

 

無気力の心理学 改版 やりがいの条件(中公新書

2冊目に紹介する本も無気力に関するものです。

この本では「獲得された無力感」、「効率感」という概念について述べています。

個人的に腑に落ちない内容だと思っているので、オススメです。 

 

功利主義入門 ―――はじめての倫理学ちくま新書

 功利主義、つまり「最大多数の最大幸福」についての本です。

一応、入門書という位置づけらしいのですが、前提となる知識が不足していたので私には内容が理解できませんでした。

 

そもそも、なぜこの本を読んだかというと「ここは今から倫理です。」を読んだ影響です。

 面白いのでオススメです。

 

2021年5月~8月

 この時期は文章に関する+その他(自己啓発ぽいもの)を読んでいました。

「文章術のベストセラー100冊」のポイントを一冊にまとめてみた。

 文章を書く上でのポイントをまとめた本です。

必要な点が完結にまとまっており、読みやすいです。 

 

調べる技術 書く技術 誰でも本物の教養が身につく知的アウトプットの極意 (SB新書)

こちらも文章作成に関するノウハウを述べたものです。

こちらは文章を使ったインプット/アウトプットの方法について重きを置いています。

 

人生は20代で決まる TEDの名スピーカーが贈る「仕事・結婚・将来設計」講義

 とあるブログで紹介されていたので、気になって読んでみました。

内容はタイトル通りです。

個人的にはここ最近で読んで一番泣きそうになりました(叱られている気分になったので)。

 

自閉症スペクトラム 10人に1人が抱える「生きづらさ」の正体 (SB新書) 新書

ここ最近、インターネットでよく目にするようになった気がする「ADHD」について知りたくなり、読みました。※自閉症スペクトラムADHDは異なります。

自閉症スペクトラムを抱えた人がどうやって周りの人間や社会と折り合いをつけていくかについて述べられています。

 

「頭のゴミ」を捨てれば、脳は一瞬で目覚める!

 直近で読んだ一番記憶に新しい本です。

個人的には、ここ約半年で一番読んで為になったと思います。

「頭のゴミ」を捨てれば、脳は一瞬で目覚める!

「頭のゴミ」を捨てれば、脳は一瞬で目覚める!

Amazon

 

終わりに

ずっと家にいるとKindleで本を買い過ぎてしまうのが難点です。

他にも小説とか漫画とか読んだので、また気が向いたら何かしら紹介するかも知れません。

 

 

ISUCON11 参加記録

ISUCON11にチーム「DREAM TEAM TRIANGLE」で参加してきました

ISCUON11に参加してきました。私達のチームは今回で2回目の参加となります。

 

結果を先に述べると、予選敗退でした。ですが去年よりは良い成績を残せました(一緒に参加した友人たちが頑張ってくれました)。

 

備忘録として、当日に行ったことを振り返りしたいと思います。

準備

特別な準備も対策も今回はしていませんでした。

前回、参加時に友人がビルド、デプロイ、ログ収集、etcを行えるようにMakefileを用意してくれていたので、今回もそれを使用しました。

作業の割り振り

作業の割り振りは以下のようになりました。

ふじもり(私):アプリケーション周り

4423:環境周り、アプリケーション

かくでん:DB

9:30

予選開始前に軽く各自の役割を確認しました。

10:00-12:00

以下のことを行いました。

  • 環境構築
  • 問題の確認
  • アプリケーションのソースコードで改善できそうな箇所を探す
  • isu, isu_conditionにインデックスを張る
  • スロークエリのログからボトルネックになっているapiを確認

13:00-16:00

以下のことを行いました。

  • サーバの構成をapp用(2台)+DB用(1台)に変更
  • nginxの設定を変更
  • getTrendで呼び出しているクエリにLIMIT 1を指定

サーバの構成を変更した際にappサーバーからDBサーバーへの接続に手こずりましたが、チームメンバーが解決してくれました。

17:00-18:45

この時点でスコアが46935になりました。

この時間帯は余計な変更は加えず、追試で失格にならないように環境に不備がないか確認していました。

終結

予選の翌日、最終結果が発表されました。

私たちのチームは最終的に

スコア:48076

となりました。

まとめ

去年は追試で失格になってしまった分、今回はスコアが記録として残せたことは良かったです。

私個人としては今回のISUCONで勉強不足であることを痛感しました。

以下のことについては次回参加までにはもっと勉強したいと思います。

・アプリケーション周りのコーディング

・nginxの設定

・クエリの改善などDB周り

・過去のISUCON参加者の記録をもっと読み込む

 

 

WSL2 + Docker + VS Code + Go 環境構築

はじめに

WSL2 + Docker + VS Code + Go の環境を構築したのでメモを残しておきます。

前提

私の環境は以下の通りになります。
Docker Desktopについてはインストール済みなので、これについてはインストール手順の記載は省略します。

  • Windows10 Home
  • Docker Desktop インストール済み


WSL2 設定手順

下記のサイトに従い、手動インストールを行っていきます。
docs.microsoft.com

LinuxWindows サブシステムを有効にする

Windows PowerShell を管理者権限で実行した後、下記のコマンドを実行します。

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart


コマンドが正常終了すれば以下のメッセージが表示されます。

PS C:\WINDOWS\system32> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.18362.1379

イメージのバージョン: 10.0.18363.1440

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。


WSL2の実行に関する要件を確認する

WSL2 を実行するには下記の要件を満たしている必要があります。

  • x64 システムの場合:バージョン 1903 以降、ビルド 18362 以上。
  • ARM64 システムの場合:バージョン 2004 以降、ビルド 19041 以上。
  • 18362 より前のビルドは WSL 2 をサポートしていません。 Windows 更新アシスタントを使用して、お使いのバージョンの Windows を更新します。


バージョンとビルド番号を確認するために、下記のように「winver」を実行してください。

f:id:huji_mori:20210705150903p:plain
winverを実行


「winver」を実行すると、下記のようにバージョンとビルド番号が表示されます。

f:id:huji_mori:20210705151034p:plain
バージョン情報確認

私の環境ではバージョンとビルド番号は以下のようになっており、WSL2の要件を満たしていることになります。

バージョン1909(OSビルド 18363.1440)


仮想マシンの機能を有効にする

Windows PowerShell 上で下記のコマンドを実行します。

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart


コマンドが正常終了すれば以下のメッセージが表示されます。

PS C:\WINDOWS\system32> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.18362.1379

イメージのバージョン: 10.0.18363.1440

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。


Linux カーネル更新プログラムパッケージをダウンロードする

下記のサイトからLinux カーネル更新プログラムパッケージをダウンロードします。
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

ダウンロードした更新プログラムパッケージを実行し、以下の画面が表示されればインストール成功です。

f:id:huji_mori:20210705152135p:plain
Linuxカーネル更新プログラムパッケージをインストール


WSL2 を既定のバージョンとして設定する

下記コマンドを実行して、WSL2 を既定のバージョンとして設定します。

wsl --set-default-version 2


正常に設定されると以下のメッセージが出力されます。

WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください


Linuxディストリビューションをインストールする

下記のサイトにアクセスし、Linuxディストリビューションをインストールします。
今回はUbuntu 20.04 LTSをインストールしました。
https://aka.ms/wslstore


インストール後、下記画面からLinuxディストリビューションを起動します。

f:id:huji_mori:20210705153758p:plain
Linuxディストリビューションをインストール後


インストール後、ユーザー名とパスワードを設定します。

f:id:huji_mori:20210705154221p:plain
wslを起動


Docker Desktop 設定

設定画面を開き、「Use the WSL 2 based engine (Windows Home can only run the WSL 2 backend)」にチェックが付いていることを確認します。
Windows Homeを使用している場合、デフォルトでチェックが入っています。

f:id:huji_mori:20210705154407p:plain
設定


Go 設定手順

下記のサイトに従い、手動インストールを行っていきます。
golang.org

Go のインストーラーをダウンロードする

下記コマンドを実行して、Go のインストーラーをダウンロードします。

wget https://golang.org/dl/go1.16.5.linux-amd64.tar.gz


Go をインストールする

下記コマンドを実行して、Go をインストールします。
※必要に応じて「sudo」を付与して、コマンドを実行してください。

rm -r/f /usr/local/go 
tar -C /usr/local -xzf go1.16.5.linux-amd64.tar.gz


下記コマンドを実行して、環境変数を設定します。

export PATH=$PATH:/usr/local/go/bin


下記コマンドを実行して、Go がインストールされていることを確認します。

go version


VS Code設定手順

下記のサイトを参考にして、VS Codeの設定を行います。
qiita.com

VS Code をインストールする

WSL2 上で下記コマンドを実行してVS Code をインストール&実行する。

code .


Go のプロジェクトフォルダを作成する

下記コマンドを実行して、Go のプロジェクトフォルダを「go-sample」という名前で作成します。

cd ~
mkdir go-sample


Dockerfile と devcontainer.json を作成する

下記コマンドを実行して、フォルダを「.devcontainer」という名前で、またファイルを「Dockerfile」と「devcontainer.json」という名前で作成します。

cd ~/go-sample/
mkdir .devcontainer
touch ~/go-sample/.devcontainer/Dockerfile
touch ~/go-sample/.devcontainer/devcontainer.json

下記のサイトを参考にして、Dockerfile と devcontainer.jsonに設定を記述します。
qiita.com

Remote Development をインストールする

Remote Development をインストールします。

f:id:huji_mori:20210705172132p:plain
Remote Developmentをインストール

Docker コンテナに接続する

画面左下の「WSL: Ubuntu-20.04」をクリックし、「Remote-Containers: Reopen in Container」を選択する。
コンテナへの接続が成功すると、画面左下に「Dev Container: go-sample」と表示される。

f:id:huji_mori:20210705172835p:plain
Docker コンテナに接続

main.goを作成する

go-sample 配下にmain.go を作成して、下記のソースを記述する。

package main

import "fmt"

func main() {
	fmt.Println("Hello, world")
}

Ctrl + F5 でmain.go を実行し、正常終了すれば下記のメッセージが表示されます。

Hello, world