さくら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
いいんじゃないでしょうか。再び先程のアドレスで接続してみると
apacheと比べるとそっけないけどnginxの初期画面が出ました。動いているようです。
ドメインでアクセスしてみる
自分で決めたドメインをDNSに登録してやります。一連の流れはこちらを参照しました
無料でドメインを取得!Freenomでのドメイン取得方法!&ドメインをさくらインターネットのVPSに設定する方法 – ちんぷいどっとねっと
これでipアドレスじゃなくてもアクセスできるようになりました。
nginxってどんな仕組みなのか
全然知らないので調べてみます。
ざっと読んで、なるほどね、となったら進みます。
設定を確認してみる
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ページが自分のドメインで表示されます。ブラウザで見てみましょう。
うまくいってるっぽいですね!
...ちなみに、ここでうまく表示されずに、いままでと変わらずnginxのウェルカムページが表示される場合は、ブラウザのキャッシュを消してみましょう。chromeならシークレットウインドウで見てみるといいかもしれません。
別ドメイン登録
引き続きfreenomで別のドメインを取得し、VirtualHostに設定してみます。さくらvpsとfreenomの設定は↑と同じなので割愛。
nginxのVirtualHost(VirtualServer)の仕組みはこのようになっているらしいです。
このとき、リクエスト先のサーバのホスト名を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環境が汚染されてしまうのを嫌う方向けにメモ。というかわたしです。
さくらvpsのDebianには2.x系も載っている
ちなみに3.x系は3.5.3が入ってました。
anacondaでやる
汚染とかなんとかいうわりに、躊躇なくanacondaを入れます。一種の宗教上のイニシエーションと思ってください。
anacondaを入れるためにはpyenvが必要で、pyenvを入れるためにはgitが必要です。いくつもの参考になる記事がありました。
pyenv+anaconda3+tensorflowの環境構築メモ
データサイエンティストを目指す人のpython環境構築 2016
それを踏まえてやったのが以下です。
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へリダイレクトしてやります。
こちらの記事を参考にしました。ありがとうございます。
まとめ
いろんな記事が乱立してて、特にLets Encryptはコマンドがよく変遷していたりapache向けだともっと便利だったりと、どれが参考になるものか見極めるのが大変でした。細かい設定は不十分なところもあると思います。
あとひさしぶりにサーバをやったのでほんとに一から構築し直しました。やったところは理解が深まった気がします。