あきらぼ

テック系ブログ

WordPress用のFTP設定

以前WordPressをインストールしたのですが、FTPを設定していなかったのでWordPressのアップデートやファイルのアップロードがブラウザ上からできませんでした。
ブラウザ上からのアップデートやアップロードにはWordPressにはFTPポートを使用しているのですが、FTPポートの設定をしていませんでした。

そこで今回はWordPress用にFTPの設定をしていこうとおもいます。




FTPデーモンのvsftpdのインストールと設定

環境はDebian系のUbuntuになります。
まずFTPサーバー用のデーモンソフトであるvsftpdをインストールしていきます。

sudo apt install vsftpd

次にvsftpdの設定をしていきます。
以下のコマンドで設定ファイルを編集していきます。

sudo nano /etc/vsftpd.conf

変える設定は以下になります。
コメントアウトをするか、なければ行を追加して設定します。

ascii_upload_enable=YES
ascii_download_enable=YES

write_enable=YES 

chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list

ls_recurse_enable=YES
local_umask=022

ssl_enable=YES

allow_writeable_chroot=YES

userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

local_root=/var/www/html

上記で設定したchroot listやuserlistのファイルを保存する /etc/vsftpd のディレクトリはデフォルトではないので作成します。(/etc/に全部置くと見ずらいので)

mkdir /etc/vsftpd

空ファイルを作成してローカルルート以上にどのユーザーもアクセスできないように制限します。
(nanoで新規作成して何も記述せずにそのまま保存終了します。)

nano /etc/vsftpd/vsftpd.chroot_list

次にFTP専用のユーザーを作成を作成します。
他の用途で使っているユーザーでFTP接続にも使うのはセキュリティ上良くないので。
ここでは便宜的にusernameというユーザーを作ります。

adduser username

次にFTP許可ユーザーリストファイルを作成して指定ユーザーのみFTPを使えるように制限します。
このファイルに先ほど作成したユーザー名を追記します。

nano /etc/vsftpd/userlist

そして設定を反映させるためにFTPを再起動します。

sudo systemctl restart vsftpd

iptablesによるFTPポートの解放

次にiptablesFTPポートである21番ポートを解放します。

sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT

設定を反映させるためにiptablesを再起動します。

sudo systemctl iptables

これでFTP接続できるようになりました。

WordPress側でのFTP設定

これでWordpressのアップデート等を行おうと思ったところ、
「wo-contentが見つかりません。」
というエラーが表示されてしまいました。

これはFTPでroot位置より上位層が表示されないように設定したためにPathがおかしくなってしまったからです。
そこでwp-config.phpを以下のドキュメントを参考に編集し、FTPの設定を行います。

https://ja.wordpress.org/support/article/editing-wp-config-php/

// ** FTP settings **//
define( 'FS_METHOD', 'direct' );                              // 私はこの設定でないとWordPressのアップデート等行えませんでした。
define( 'FTP_BASE', './' );                                         // vsftpdの設定でWordPressのフォルダをrootに指定したのでBASEパスはルートになります。
define( 'FTP_CONTENT_DIR', '/wp-content/' );
define( 'FTP_PLUGIN_DIR ', '/wp-content/plugins/' );
define( 'FTP_USER', 'username );                           //ここで先ほど作成したFTP用のユーザー指定します。
define( 'FTP_HOST', 'localhost' );                          //phpでサーバー側でリクエストが送られるのでHostはlocalhostで大丈夫です。
define( 'FTP_SSL', true );                                       //セキュリティ的にSSL有効化しているので設定します。

これでパスの設定は完了しました。

ファイルのアクセス権限設定

しかし今度は「ディレクトリが作成できません。」とのエラー表示が出てきてしまいました。

FTPで直接フォルダを作成することができたのでFTPの話ではないようです。
調べてみるとApacheが使用しているユーザーに権限がなく、ディレクトリ作成等ができていなかったようです。

そこでまずApacheで使用しているユーザーを確認します。
Apacheのユーザーはenvvarsに記述があるので確認します。

cat /etc/apache2/evnvars

以下のようにwww-dataというユーザー名とグループ名で定義されていました。

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

なのでwordpressのインストール先の所有者をwww-dataにするかアクセス権を全ユーザーにすることで解決できます。
所有者をwww-dataにする場合は

sudo chown -R www-data:www-data WordPressのインストールディレクトリ

アクセス権を全ユーザーにする場合は

sudo chmod -R 777 WordPressのインストールディレクトリ

となります。

FTPは基本的にはwp-contentのディレクトリでしか使われなさそうなので、FTP用に作成したユーザーの権限をwp-contentに与えれば問題ありません。

このあたりの権限設定はサーバーの共有状況等に応じて設定すればいいと思います。

これで設定が完了し、メディアのアップロード、WordPressバージョンのアップデート、プラグインのインストール等ができるようになりました。