広告 忘備録

Windows11・WSL2でUbuntu22.04とnginxの開発環境構築

10月 16, 2024

最新のUbuntu24だとPythonのライブラリ管理が面倒だったので

WSL2とUbuntu22.04のインストール

WSL2インストール

Powershellを開き、

wsl --install

するとインストールが始まる。

インストールが完了すると、再起動と言われる。

再起動したら勝手に最新のUbuntu24.04がインストールされてしまっていた。

こいつを消して22.04を入れなおしていく。

インストール済み一覧

PS C:\Users\hoge> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

アンインストール

PS C:\Users\hoge> wsl --shutdown
PS C:\Users\hoge> wsl --unregister Ubuntu
登録解除。
この操作を正しく終了しました。

改めて22.04をインストールしていこう。

インストール可能バージョン確認

PS C:\Users\hoge> wsl -l -o
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                            FRIENDLY NAME
Ubuntu                          Ubuntu
Debian                          Debian GNU/Linux
kali-linux                      Kali Linux Rolling
Ubuntu-18.04                    Ubuntu 18.04 LTS
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
Ubuntu-24.04                    Ubuntu 24.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_7                 Oracle Linux 8.7
OracleLinux_9_1                 Oracle Linux 9.1
openSUSE-Leap-15.6              openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
openSUSE-Tumbleweed             openSUSE Tumbleweed

Ubuntu 22.04を指定してインストール

PS C:\Users\hoge> wsl --install -d Ubuntu-22.04
インストール中: Ubuntu 22.04 LTS
Ubuntu 22.04 LTS がインストールされました。
Ubuntu 22.04 LTS を起動しています...
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:

ユーザー名とパスワードを設定すればインストール完了だ。
ちなみにubuntuに入りたいときは、Powershellからwslと打てばいい。

WSL2からインターネットに繋がらなくなる問題

WSLでUbuntuなりを動かしていて、ソフトの追加等でresolv.confが変わってしまうと、それ以降インターネットに繋がらなくなる問題がある。
僕の場合はNordVPNが全く繋がらなくてサポートに連絡しようかと思ったほど。

対応策はこちら
Windows内に「C:\Users\<<ユーザ名>>.wslconfig」ファイルを作成し、以下の内容で保存しておく。
WSLの再起動で反映される。

[wsl2]
dnsTunneling=true

Ubuntu内の環境構築

パスワード無しでsudo

開発環境でsudoのたびにパスワード入力は面倒なので、省略してしまおう。

$ sudo visudo
#hogeはユーザー名。これを任意の場所に配置する。
hoge ALL=NOPASSWD: ALL 

zshのインストール

$ sudo apt install zsh

# ついでにログインシェルもzshに変更しておく
$ chsh -s /bin/zsh

これでターミナルやvscodeを再起動すれば、zshで起動できるようになる。

MySQLのインストール

# MySQLのインストール
$ sudo apt update
$ sudo apt install mysql-server

# バージョン確認
$ mysql --version

# 初期設定
$ sudo mysql_secure_installation

# 最初のログインはsudoで
$ sudo mysql -u root

# rootのパスワード設定
$ ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

nginx/php-fpmのインストール

さっそくインストールしていく。

$ sudo apt-get install nginx php-fpm

インストールが完了したら、バージョンを確認しておこう。
2024年10月現在はphp8.1-fpmがインストールされた。

$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)

$ php -v
PHP 8.1.2-1ubuntu2.19 (cli) (built: Sep 30 2024 16:25:25) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.19, Copyright (c), by Zend Technologies

インストールが完了したら、nginxでPHPが動くように設定。

$ sudo vi /etc/nginx/sites-enabled/default

$ sudo vi /etc/nginx/sites-enabled/default

        # このPHP関連の箇所がコメントされているので外す。
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

                # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/run/php/php8.1-fpm.sock; # ここをphp8.1に変更
                # With php-cgi (or other tcp sockets):
                # fastcgi_pass 127.0.0.1:9000; # ここはコメントのまま
        }

$ sudo service nginx restart

hostsファイルでローカルドメイン

プロジェクトを複数動かす場合は、ローカル専用のドメインを用意しておくと便利。
Windowsなら「C:\windows\system32\drivers\etc\hosts」、WSLのUbuntuなら「/etc/hosts」にそれぞれ以下の形式で書いておけば、hogehogeにアクセスするとlocalhostにアクセスできる。
CURLやpostもこれで動くようになる。
nginxの仮想複数ドメイン運用もこれでOK。

127.0.0.1 hogehoge

次で説明するhostsファイル書き換え禁止の設定も忘れずに。

/etc/wsl.confの設定

このファイルを設定しておくと、WSL特有の動きの制御などができる。

# WSL起動時設定
[boot]
systemd=true # systemctlを使うにはこれが必要
[network]
generateResolvConf = false # /etc/resolv.confが勝手に上書きされないようにする
generateHosts = false # /etc/hostsが勝手に上書きされないようにする

NordVPN for linux が動かない件

nordvpnにはコマンドラインのlinux用のソフトも提供されているのだが、これを使ってVPNに接続しようとすると、失敗するだけでなくネットにもつながらなくなってしまう(再起動で解消)
ちなみにWireGuardでも発生するみたい。OpenVPNでは大丈夫だったので、接続方式に関係してるのかな。

/etc/resolv.confやらiptablesやらIPv6無効やらいろいろと試したが駄目で、サポートやりとりしたりで数日かかってしまったが、最終的な解決策にたどり着いた。
4年前の投稿なのに、Microsoftは直してくれないのかね。
https://www.reddit.com/r/bashonubuntuonwindows/comments/jk4x24/comment/gah860j/

まずはUbuntu内にて、Githubから最新のカーネルをwgetで持ってくる。好きな場所で実行して大丈夫。1.6Gぐらいある。

$ git clone --branch $(uname -r) --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel.git

次にダウンロードしたWSL2-Linux-Kernelディレクトリに入り、今の.configファイルをコピーしていれる。

zcat /proc/config.gz > .config

コピーした.configファイルを開き、以下の行を探す。
似たような行が多いので間違えないように。

# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set

コメントをはずし、以下のように変更する。

CONFIG_NETFILTER_XT_MATCH_CONNMARK=y

そしたら同じディレクトリ内で、コンパイルのコマンド。

make -j $(nproc)

$(nproc)は、CPUが処理できるスレッド数。何らかの理由でスレッド数を少なくしたい場合は、この値を編集することもできる。
CPUによっては時間がかかる。

コンパイルが終わったら、正しい.configが含まれたイメージファイルを、自分のWindowsユーザーディレクトリにコピー。

$ cp arch/x86/boot/bzImage /mnt/c/Users/hoge

つづいてWindowsにて C:\Users\hoge\.wslconfig を作成し、以下を記入して保存。
これで次回Ubuntu起動時に、作ったカーネルのイメージファイルが使われるようになる。

[wsl2]
kernel=C:\\Users\\hoge\\bzImage

PowerShellを開き、シャットダウンも忘れずに。

wsl --shutdown

NordVPN for linux がアップロードできなくなる件

これはWSLのUbuntu内のDockerで各Linuxを動かす際に発生したのだが、ある日なぜかデータのアップロードだけが出来なくなった。
スピードテストを行っても、ダウンロードは十分にスピードが出るのに対して、アップロードでは止まってしまう。
NordVPN側で何かブロックがかかってしまったのだろうか。

普通のWSLのUbuntuやDebianでは発生しないのだが、Docker内にて発生。
丸一日かけて調査したところ、とりあえずtechnologyをOPENVPNに変更することで対応できた。

nordvpn set technology openvpn

※danteサーバーを使う場合は、/etc/sockd.confのexternalをnordlynxからnordtunに変更を忘れずに。
ip aコマンドで現在の状況を確認できる。

  • この記事を書いた人

たろう

タイ在住のアフィリエイター
最新総フォロワー数:
𝕏:
総収益 5,303円 $296.26

現在アダアフィ挑戦中|英語・タイ語ガチ勢|現地民とお酒を飲むために語学勉強

-忘備録