NginxでBasic認証を設定

Webシステムに簡易的なユーザー認証を設定する方法として、Basic認証はアプリケーション本体と切り離して簡単に導入できるためとても便利です。特に開発中のシステムをデモ目的等で一時的に公開したい場合や、少人数で利用する小さなシステムに認証を設定したい場合に有効だと思います。

.htpasswdファイルの作成

.htpasswdファイルはユーザー名とパスワードの組み合わせを保存するファイルになります。ファイル名は慣習的に.htpasswdという名前にすることが多いですが、必ずしもそうする必要性はありません。

.htpasswdファイルを作成するには、Linux上ではhtpasswdコマンドを利用するのが便利です。Ubuntuにおいてhtpasswdコマンドが利用できない場合は、apache2-utilsライブラリをインストールするのが良いと思います。

$ sudo apt install apache2-utils

htpasswdコマンドが利用できるようになったら、次のコマンドで.htpasswdファイルを作成します。

$ sudo htpasswd -c /etc/nginx/.htpasswd <username>

cオプションでファイルの出力先を指定します。Nginxの実行ユーザーがアクセスできればどこでも大丈夫ですが、Nginxの設定フォルダかアプリケーションの設置フォルダに配置するのが良いと思います。Webからアクセスできないように注意しましょう。

<username>の部分には、作成したいユーザー名を指定します。

上記のコマンドを入力すると、次のようなプロンプトが表示されますので、設定したいパスワードを入力してエンターを押してください。以上で.htpasswdファイルの完成です。

New password:
Re-type new password:

Nginxの設定

.htpasswdファイルができたら、Nginxの設定ファイルにそのファイルを指定します。Basic認証を指定したいパスのlocationディレクティブに次の設定を追加します。

server {
    ...
    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

auth_basicには認証ダイアログに表示させたい文字列を指定します。(ただ、最新のブラウザでは、ここに設定しても表示されないようになってしまったように思われます。)auth_basic_user_fileには先ほど作成した.htpasswdファイルのパスを指定します。

最後にNginxの設定をリロードすれば設定が適用されます。

$ sudo systemctl reload nginx

SSLで利用するよう注意

Basic認証のダイアログで入力されたユーザー名とパスワードは、コロン「:」で連結された後、Base64でエンコードされてサーバーに送られます。デコードすれば簡単にパスワードが見られてしまうため、非SSL(https://ではない)のWebサーバーでは、特別に通信が秘匿される手段が用意されている場合を除いて、利用しないようにしましょう。

Linuxで所有者と権限を指定してディレクトリを作成

Linuxでディレクトリを作成するにはmkdirコマンドを利用します。

$ mkdir sample_dir

作成したディレクトリの所有者を変更するにはchownコマンドを利用します。

$ chown sample_user:sample_group sample_dir

さらに作成したディレクトリの権限を変更するにはchmodコマンドを利用します。

$ chmod 755 sample_dir

このように通常3回コマンドを実行する必要があるのですが、installコマンドを利用すると、ディレクトリの作成と所有者および権限の指定を同時に行うことができます。

$ install -d -m 0755 -o sample_user -g sample_group sample_dir

地味に便利です。

CentOSでLet’s Encryptを自動更新

Let’s Encryptは無料で利用できるSSL証明書です。ただ、90日間で期限が切れてしまうため、定期的に更新する必要があります。

証明書の更新はコマンドのみで実行できるため簡単ですが、それでも手動で行うのは手間が掛かりますし、更新を忘れてしまいがちですので、Cronを利用して自動実行するのが良いと思います。

$ sudo crontab -e
00 04 01 * * certbot renew && systemctl reload nginx

上記の例では、毎月1日早朝4時に証明書の更新を行っています。また、Webサーバーは更新済みの証明書を再度読み込む必要があるため、Nginxサービスに対してreloadコマンドを実行しています。


追記

CentOSでyumでインストールした場合、自動更新用のサービス(certbot-renew)が用意されているので、そちらを利用した方が良いと思われます。

$ sudo systemctl enable --now certbot-renew.timer

更新後にNginxをリロードする場合は、次のファイルに設定します。

$ sudo vi /etc/sysconfig/certbot
POST_HOOK="--post-hook 'systemctl reload nginx'"

UbuntuへのPHPのインストールとバージョンの切り替え

PHPのインストール

まず、PHP用のaptのPPA(Personal Package Archive)リポジトリを追加します。

$ sudo apt install -y software-properties-common
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt update

次に、追加したPPAリポジトリを利用して、必要なバージョンのPHPをインストールします。ここではPHP 7.3をインストールしています。

$ sudo apt install -y php7.3

PHPのバージョンを切り替える

開発しているアプリケーションに応じて、使用するPHPのバージョンを変えたい場合があると思います。その際には、update-alternativesコマンドを利用すると、簡単にバージョンを切り替えることができます。

例えば、php7.2に切り替えたい場合は、次のように行います。まず、aptコマンドでphp7.2をインストールします。

$ sudo apt install -y php7.2

その上で、update-alternativesコマンドを次のように実行します。既にインストールされているバージョンの一覧が表示されますので、インストールしたいバージョンのSelectionの列の数字を入力し、Enterを押します。

$ sudo update-alternatives --config php
There are 2 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status
------------------------------------------------------------
  0            /usr/bin/php7.3   73        auto mode
  1            /usr/bin/php7.2   72        manual mode
* 2            /usr/bin/php7.3   73        manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/php7.2 to provide /usr/bin/php (php) in manual mode

以上で、バージョンの切り替えが完了します。

Dockerを使ってみる

はじめに

Dockerはオープンソースのコンテナ型仮想化ソフトウェアです。VirtualBoxやVMWare等のサーバー仮想化技術とは異なり、一つのOS上に独立したユーザー空間を作ることによって仮想化を実現するため、リソースの使用量が少なくて済むという特徴を持ちます。

導入

DockerをCentOS7上にインストールします。(ちなみにv1.8以降はCentOS6のサポートはされない模様です。)

リポジトリの登録

まず、Dockerの公式リポジトリをyumに登録します。

$ sudo vim /etc/yum.repos.d/docker.repo

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

Dockerのインストール

yumを利用して、docker-engineパッケージをインストールします。

$ sudo yum install docker-engine

SELinuxが有効の場合は、docker-selinuxもインストールします。

$ sudo yum install docker-selinux

自動起動設定

dockerサービスがサーバー起動時に自動起動されるよう設定します。

$ sudo systemctl enable docker

起動

dockerサービスを起動します。

$ sudo systemctl start docker

コンテナの作成

コンテナイメージのダウンロード

準備が整ったのでコンテナを作成します。コンテナの作成には、その基となるコンテナイメージを利用します。各Linux OSのコンテナイメージはDocker Hubというリポジトリで公開されています。例えば、CentOSのコンテナイメージをダウンロードする場合は、以下の様にします。

$ sudo docker pull centos

ダウンロードしたコンテナイメージはローカルリポジトリに保存されます。保存されているイメージの一覧を確認するには、imagesコマンドを実行します。

$ sudo docker images

コンテナの作成

コンテナイメージを利用してコンテナを作成するにはrunコマンドを実行します。使用するイメージと作成したコンテナ上で実行するコマンドを引数として与えます。

$ sudo docker run centos echo "Hello World"

また、コンテナ作成後にログインをしたい場合は、-i(標準入力を開け続ける)と-t(疑似端末を割り当てる)のオプションを与えた上で、コマンドとしてシェルを指定します。

$ sudo docker run -it centos bash
[root@xxxxxxxxxxxx /]#

コンテナから抜けるにはexitコマンドを実行します。その際、コンテナは自動的に停止します。

[root@xxxxxxxxxxxx /]# exit
$

また、コンテナを作成する際に、コンテナに名前を設定するには–nameオプション、ホスト名を設定するには–hostname(または-h)オプションを利用します。

$ sudo docker run --name test-container --hostname test-host centos

コンテナの削除

存在しているコンテナの一覧を確認するにはpsコマンドを利用します。オプション-aによって、停止しているコンテナを含めて全てが表示されます。

$ sudo docker ps -a

削除したいコンテナを確認したら、IDまたはNAMEを指定してrmコマンドを実行します。実行中のコンテナを削除する場合は-fオプションを付与します。

$ sudo docker rm de3d1454fd9e

 

firewalldによるファイアウォール設定

はじめに

CentOS7からはiptablesではなくfirewalldというファイアウォールが導入されました。(iptablesも利用できるようですが、firewalldが標準となっています。)

起動

起動しているか確認するには、systemctlのstatusコマンドを実行します。

$ sudo systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Tue 2015-11-03 22:27:20 JST; 2h 3min ago
 Main PID: 605 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─605 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

上記のようにactiveという表示が出ていれば起動しています。起動していなければstartコマンドで起動させることができます。

$ sudo systemctl start firewalld

また、自動起動サービスとして登録するには、enableコマンドを実行します。

$ sudo systemctl enable firewalld

ゾーンという概念

 

さくらVPSにWordPressをインストール

さくらVPSのCentOS6サーバーに、WordPressをインストールしたので、その手順を残します。

PHPのインストール

まず、WordPressの使用言語であるPHPと必要なモジュールをインストールします。yumコマンドを使えば一発です。

$ sudo yum install php php-gd php-mbstring php-mysql

MySQLのインストール

次に、データベースであるMySQLをインストールします。こちらもyumを使えます。

$ sudo yum install mysql-server

インストールが完了したら起動させます。

$ sudo service mysqld start

wordpressのためのデータベースとユーザーを作成します。今回は、いずれも「wordpress」としました。(省略しますが、rootユーザーのパスワードをまず設定した方がよいです。)

$ mysql -u root

mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@localhost IDENTIFIED BY 'password';
Query OK, 0 row affected (0.00 sec)

mysql> exit
Bye

WordPressの設置

次に、WordPressの設置に進みます。まず、WordPressの公式ページから最新zipパッケージをダウンロードし、展開します。

$ cd /tmp
$ wget https://ja.wordpress.org/latest-ja.zip
$ unzip latest-ja.zip

wordpressという名前のディレクトリが作成されていることを確認できると思います。これを、実際WordPressを運用する場所に配置します。今回は、後述するApacheのバーチャルホストを利用することを考え、以下の場所にいたしました。ちなみに、今回インストールするWordPressにアクセスするためのドメインをblog.codebase.co.jpとしています。

$ sudo mkdir -p /var/www/vhosts/blog.codebase.co.jp
$ sudo mv wordpress /var/www/vhosts/blog.codebase.co.jp

 

Apacheのインストール

最後に、WebサーバーであるApacheをインストールします。こちらもyumで一発です。

$ sudo yum install httpd

インストールが完了したら、Apacheのバーチャルホスト設定にWordPressを追加します。

$ cd /etc/httpd/conf.d
$ sudo vim vhosts.conf

NameVirtualHost *:80

# WordPress
<VirtualHost *:80>
    DocumentRoot /var/www/vhosts/blog.codebase.co.jp/wordpress
    ServerName blog.codebase.co.jp
    ErrorLog /var/www/vhosts/blog.codebase.co.jp/log/error_log
    CustomLog /var/www/vhosts/blog.codebase.co.jp/log/access_log combined env=!nolog
    <Directory "/var/www/vhosts/blog.codebase.co.jp/wordpress">
        AllowOverride All
    </Directory>
</VirtualHost>

ログファイルが出力されるフォルダを作成します。

$ sudo mkdir /var/www/vhosts/blog.codebase.co.jp/log

ユーザーapacheがWordPressのログや設定ファイル等を読み書きできるように、blog.codebase.co.jpディレクトリ以下の所有権をapacheに変更します。

$ sudo chown apache:apache /var/www/vhosts/blog.codebase.co.jp -R

Apacheを起動します。

$ sudo service httpd start

WordPressの初期設定

以上で、WordPressが立ち上がっている状態になっています。今回の例であればhttp://blog.codebase.co.jpにアクセスすることで、セットアップウィザードが開始しますので、データベースへの接続情報等を入力して初期設定を完了させます。

Top