電波ビーチ

☆(ゝω・)v

さくらvps+debian+nginx+httpsでVirtualHost

さくらvpsの一番安いやつに入れていきます。

Debianを入れる&&設定

適当にカスタムOS選択からDebian9で。OS入れるのは何度か記事にしているのでそれに準じてsshとかの設定も終わらせる。

nginx入れる

apacheなら使ったことあるけどnginxは初めてなので順番に。

  • wgetでキーを取得してくる。
wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key
  • /etc/apt/sources.listにパッケージのDL元を加える。
sudo vim  /etc/apt/sources.list

などとして末尾に

deb http://nginx.org/packages/debian/ stretch nginx
deb-src http://nginx.org/packages/debian/ stretch nginx

と追加

  • リポジトリに変更を加えたので更新
    sudo apt-get update
  • nginxを入れる
    sudo apt-get install nginx
  • 確認
    sudo nginx -v

よくできました。

IPアドレスで接続してみる

vpsのアドレスを確認しておきます。さくらvpsの管理画面で見れば一発。なんか接続できなければnginxの状態を確認してみましょう。service nginx statusでいけます

~$ sudo service nginx status
● nginx.service - nginx - high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
   Active: inactive (dead)
     Docs: http://nginx.org/en/docs/

あらら、死んでいますね。。。現在の設定で再起動しましょう。service nginx restartでいけます

● nginx.service - nginx - high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
   Active: active (running) since Thu 2018-05-31 20:47:18 JST; 1s ago
     Docs: http://nginx.org/en/docs/
  Process: 9723 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited,
 Main PID: 9724 (nginx)
    Tasks: 2 (limit: 4915)
   Memory: 2.0M
      CPU: 10ms
   CGroup: /system.slice/nginx.service
           ├─9724 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           └─9725 nginx: worker process

いいんじゃないでしょうか。再び先程のアドレスで接続してみると f:id:or3:20180531205431p:plain

apacheと比べるとそっけないけどnginxの初期画面が出ました。動いているようです。

ドメインでアクセスしてみる

自分で決めたドメインDNSに登録してやります。一連の流れはこちらを参照しました

無料でドメインを取得!Freenomでのドメイン取得方法!&ドメインをさくらインターネットのVPSに設定する方法 – ちんぷいどっとねっと

これでipアドレスじゃなくてもアクセスできるようになりました。

nginxってどんな仕組みなのか

全然知らないので調べてみます。

www.slideshare.net

ざっと読んで、なるほどね、となったら進みます。

設定を確認してみる

nginxの設定ファイルは/etc/nginx/nginx.confにあるみたいなので覗いてみます。

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

apacheの設定ファイルと比べるとだいぶすっきりしていてみやすい印象。ディレクティブは一行で終わるものと{}で囲まれたものがあり、それぞれシンプルディレクティブ、ブロックディレクティブというらしいです。

VirtualHost(nginxの文化ではVirtualServerというらしいけどこっちのが一般的っぽいのでこっちを使います)で複数のサイト持つ際のそれぞれの設定はserverディレクティブに書くのですが、最終行のinclude /etc/nginx/conf.d/*.conf;でそれを取り込んでいます。

sudo cat /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

なので、このdefault.confをコピーしてサイト名でリネームしたやつを個別に編集すればよさそうです。

VirtualHost設定

そいういえば、 yoshinorin.net virtualhostするときになんでいくつも方法があるのか不思議だったんですが、単にsites-availableに書くと管理が簡単、というだけらしいです。めんどくさいので今回はconf.dにおいていくことにします

デフォルトの設定をコピーして編集していきます。

sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/ドメイン名.conf

さて、デフォルトではドキュメントルートはlocationディレクティブを見ると,

root   /usr/share/nginx/html;

となっています。ですが、なんかネットを眺めるとapache文化でおなじみの/var/www/ドメイン名/public_html以下に置いている例が多そうだったので、それに準じることにします。( こちら を参考にしました)

sudo mkdir -p /var/www/ドメイン名/public_html

ついでに読み書き権限を与えておきます

sudo chmod -R 755 /var/www

その下に適当なhtmlを置いておきましょう。

sudo vim  /var/www/ドメイン名/public_html/index.html

<!DOCTYPE html>
<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <h1>Under construction</h1>
    </body>
</html>

そしたらコピーしたconfを編集します。server_nameを自分のドメインに、locationディレクティブのrootを先程htmlを置いたパスに指定。

終わったら設定を反映させます。

sudo service nginx restart

これで自分で作ったwebページが自分のドメインで表示されます。ブラウザで見てみましょう。

f:id:or3:20180602190611p:plain

うまくいってるっぽいですね!

...ちなみに、ここでうまく表示されずに、いままでと変わらずnginxのウェルカムページが表示される場合は、ブラウザのキャッシュを消してみましょう。chromeならシークレットウインドウで見てみるといいかもしれません。

ドメイン登録

引き続きfreenomで別のドメインを取得し、VirtualHostに設定してみます。さくらvpsとfreenomの設定は↑と同じなので割愛。

nginxのVirtualHost(VirtualServer)の仕組みはこのようになっているらしいです。

heartbeats.jp

このとき、リクエスト先のサーバのホスト名をHost:ヘッダフィールドに指定します。この例では"example.com"というホスト名が指定されています。nginxはこのリクエストを受け取ると、このホスト名がserver_nameディレクティブに設定したサーバ名に一致するserverディレクティブのバーチャルサーバを選び、そのserverディレクティブ内の設定が適応されます。このようにserver_nameディレクティブは名前ベースのバーチャルサーバを設定するために使われます。

ということなので、やはりふつうにconf.d以下に加えればいいっぽいです。ただし、最初のスライドにもあったように、いずれの名前にも該当しなかった場合のデフォルトサーバの設定をしないと、URIパスの評価によって不意なドメインが採用されてしまうらしいです。

ドメインの登録のやり方も↑と同じなので割愛。restartを忘れずに。

うまくいったので、次です。

https化

ならLet's Encriptでしょう。前にやったことあるけど忘れているし、複数サイトの設定は初めてなのでメモがてら。

こちらを参考にします。ありがとうございます。

nginx と Let's Encrypt で1台のサーバーで複数サイトを SSL 化

(必須ではないけどpythonを使うので環境が気になる方向け)

Let's EncriptはPythonを使って動かしたり設定したりするのですが、python環境が汚染されてしまうのを嫌う方向けにメモ。というかわたしです。

さくらvpsDebianには2.x系も載っている

ちなみに3.x系は3.5.3が入ってました。

anacondaでやる

汚染とかなんとかいうわりに、躊躇なくanacondaを入れます。一種の宗教上のイニシエーションと思ってください。

anacondaを入れるためにはpyenvが必要で、pyenvを入れるためにはgitが必要です。いくつもの参考になる記事がありました。

pyenv+anaconda3+tensorflowの環境構築メモ

データサイエンティストを目指す人のpython環境構築 2016

pyenv + anaconda + python3

それを踏まえてやったのが以下です。

sudo apt-get install git
sudo git clone git://github.com/yyuu/pyenv.git ~/.pyenv
it clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv install -l | grep anaconda3
pyenv install anaconda3-5.2.0
pyenv global anaconda3-5.2.0

で、適当に仮想環境を作ります。

Let's Encrypt

Let's Encrypt で Nginx にSSLを設定する こちらを参考にしました。ありがとうございます。

sudo apt-get install certbot

して、

sudo certbot certonly --webroot -w /var/www/sample1.com/public_html -d sample1.com -m メールアドレス --agree-tos

Conguratulation!と出れば成功です。ちなみに複数サイトを-w /var/www/sample2.com/public_html -d sample2.comとして続けてやれば一発でできるそうですが、わたしは忘れていたので別々で実行しました。

証明書を反映

いまのは単に証明書を発行しただけで、.confのserverディレクティブでそれを読み込む必要があります。

書き換えたやつがこちら(一部)

# listen       80;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/sample1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sample1.com/privkey.pem;

これでserivice nginx restartすれば、果たしてSSLで接続できました!

リダイレクト

ついでに、httpでのアクセスをhttpsへリダイレクトしてやります。

lealog.hateblo.jp

こちらの記事を参考にしました。ありがとうございます。

まとめ

いろんな記事が乱立してて、特にLets Encryptはコマンドがよく変遷していたりapache向けだともっと便利だったりと、どれが参考になるものか見極めるのが大変でした。細かい設定は不十分なところもあると思います。

あとひさしぶりにサーバをやったのでほんとに一から構築し直しました。やったところは理解が深まった気がします。