(Ubuntu) NginxのVirtual Hostで複数ドメインの設定をする

Pythonで作ったWebアプリを動かすのにさくらのVPSを契約しましたが、動作テストをするのに新しくドメインを取得するのももったいないので、まずは、このブログのサブドメインでテスト環境を構築していこうと思います。

NginxのVirtualHostで複数ドメインを運用すると、テスト環境の構築と破棄が楽になりそうな気がするので、試しにやってみようと思います。

動作環境は、Ubuntu20.04で、Nginxはインストールしていることが前提です。

index.htmlの作成

今回、私が設定するドメインは、demo.dattesar.comです。

ドメインdemo.dattesar.com

index.htmlを置くディレクトリを作成

まずは、index.htmlを置いておくディレクトリを作成して、所有者を変更します。

sudo mkdir -p /var/www/demo.dattesar.com/html
sudo chown -R $USER:$USER /var/www/demo.dattesar.com/html/

-pオプションを付けて、親ディレクトリも同時に作成しています。

パーミッション755

私の環境では何もせずに、パーミッションは755になっていましたが、755じゃない場合は755(所有者のみ書込可)に変更します。

sudo chmod -R 755 /var/www/demo.dattesar.com/html

index.htmlを作成

nano /var/www/demo.dattesar.com/html/index.html
index.html
<h1>demo.dattesar.com Virtual Host TEST</h1>

適当に1行だけ作成しています。

defaultファイルの確認

/etc/nginx/sites-availableにあるdefaultファイルを確認します。

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or WordPress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	# SSL configuration
	#
	# listen 443 ssl default_server;
	# listen [::]:443 ssl default_server;
	#
	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
	}

	# pass PHP scripts to FastCGI server
	#
	#location ~ \.php$ {
	#	include snippets/fastcgi-php.conf;
	#
	#	# With php-fpm (or other unix sockets):
	#	fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	#	# With php-cgi (or other tcp sockets):
	#	fastcgi_pass 127.0.0.1:9000;
	#}

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


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#	listen 80;
#	listen [::]:80;
#
#	server_name example.com;
#
#	root /var/www/example.com;
#	index index.html;
#
#	location / {
#		try_files $uri $uri/ =404;
#	}
#}

74行目以降に、VirtualHostの設定例が書いてあるので、これを元にconfファイルを作成していきます。

# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#       listen 80;
#       listen [::]:80;
#
#       server_name example.com;
#
#       root /var/www/example.com;
#       index index.html;
#
#       location / {
#               try_files $uri $uri/ =404;
#       }
#}

confファイルの設定

defaultのファイルをコピーして、編集していきます。

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/demo.dattesar.com.conf
sudo nano /etc/nginx/sites-available/demo.dattesar.com.conf

Virtual Host の設定

defaultファイルの73行目までは削除して、74行目以降だけ記述していきます。

コメントアウトを外すのを忘れないように。

demo.dattesar.com.conf
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
server {
       listen 80;
       listen [::]:80;

       server_name demo.dattesar.com;
       access_log /var/log/nginx/demo.dattesar.com-access.log;
       error_log /var/log/nginx/demo.dattesar.com-error.log;

       root /var/www/demo.dattesar.com/html;
       index index.html;

       location / {
               try_files $uri $uri/ =404;
       }
}

/etc/nginx/sites-enabled/にリンク

/etc/nginx/sites-enabled/に、先ほど作成したconfファイルのシンボリックリンクを作成します。

sudo ln -s /etc/nginx/sites-available/demo.dattesar.com.conf /etc/nginx/sites-enabled/

defaultの設定を使わない場合は、defaultをunlinkします。

sudo unlink /etc/nginx/sites-enabled/default

設定の確認

confファイルの設定にエラーが無いか確認します。

configtest

sudo /etc/init.d/nginx configtest

この時に、sudoをつけてコマンドを打たないと、エラー無くても【fail】で返ってくるので注意してください。

私はsudoを付け忘れて、ステータスが何故【fail】で返ってくるのか分からなくて、何度もconfファイルを書き直しました。

sudo nginx -t (こっちの方が良い)

sudo nginx -t

sudoを付けないとエラーメッセージが出るので、このコマンドの方がおすすめです。

nginxの再起動

configのテストが【OK】なら、nginxを再起動して設定を反映させます。

sudo systemctl restart nginx
sudo systemctl status nginx

設置テスト

http://demo.dattesar.com/

まだSSL化していないので、httpのままですが、とりあえず、Virtual Hostの設定は出来ました。

→ その後、SSLの設定をして、httpsにリダイレクトされるようにしました。