XserverでDjangoを利用する必要が生じたために、環境構築をしたい。
管理者権限(root権限)が与えられていないため、ユーザ権限の下で環境構築する方法を教えて欲しい。
こんなお悩みを解決します。
諸般の事情により、Xserverに設定している同一ドメインを用いて、WordPressとDjangoを動作させることになりました。
VPSサーバであれば、管理者権限が与えられているため、環境構築には困らないのですが、共有サーバ上(Xserver上)となると対応が異なってきます。
今回は、Homebrew(Linuxbrew)を用いて、ユーザ管理下にPython+pipenv(Pythonの仮想環境)を構築する方法を解説します。
参考情報としてご覧ください。
素早く環境構築したい方へ
環境構築が比較的容易で、共有サーバよりも、カスタマイズの自由度が高いものを求めている場合、仮想専用サーバ(VPS)を利用することをおすすめします。
詳細は、以下の記事をご覧ください。
【比較】おすすめのVPS 4選
続きを見る
参考サイト
今回の方法で環境構築を行う上で、以下のサイトを参考にさせていただきました。
https://qiita.com/joshnn/items/244ca701c1bf9be8f350
また、上記のリンクでは、一部非公式なやり方が採用されており、今後の不具合にも直結しそうだったため、私の方で原因を解消した状態の手順に更新したものを環境構築時の方法として紹介します。
前提
Xserverで作業するためには、SSH接続が必要となります。
今回は、SSH接続の準備はすでに完了しているものとします。
Homebrewインストール時の問題
ユーザ環境下でPythonをインストールするためにHomebrewというツールを利用します。
しかし、Xserver上にインストールされている依存ライブラリgit、curlが古いため、Homebrewでエラーが発生します。
Error: Please update your system curl or set HOMEBREW_CURL_PATH to a newer version.
Minimum required version: 7.41.0
Your curl version: 7.29.0
Your curl executable: /usr/bin/curl
Error: Please update your system Git or set HOMEBREW_GIT_PATH to a newer version.
Minimum required version: 2.7.0
Your Git version: 1.8.3.1
Your Git executable: /usr/bin/git
今回は、ソースコードからgit、curlをビルドすることでこれらのエラーを解決します。
ディレクトリ構成
作業を進める上で、全体像が把握できている方が良いため、ディレクトリ構成を示しておきます。
${HOME}/
|-- _tmp/
|-- opt/
| |-- curl/
| |-- gettext/
| |-- git/
| `-- ssl/
`-- .linuxbrew/
|-- Homebrew/
|-- bin/
`-- (その他インストール済みライブラリ)
それぞれのディレクトリの意味は、以下のようになります。
ディレクトリ名 | 説明 |
---|---|
_tmp | 各種ライブラリをインストールするための作業場所 |
opt/curl | Homebrewで利用するcurlのインストール先 |
opt/gettext | gitインストール時の依存ライブラリのインストール先(gitは内部でmsgfmtを利用している) |
opt/git | Homebrewで利用するgitのインストール先 |
opt/ssl | curlインストール時の依存ライブラリのインストール先(curlは内部でopensslを利用している) |
.linuxbrew | Homebrewのインストール先 |
環境構築
実際に環境構築を進めていきます。
環境変数の設定
事前に必要な環境変数を設定しておきます。
エディタで~/.bash_profileを開き、下記のコードを記入し、保存します。(私は、viを利用して編集しました。)
# ~/.bash_profileに記載する内容
export HOMEBREW_FORCE_BREWED_GIT=
export HOMEBREW_FORCE_BREWED_CURL=
export HOMEBREW_CURL_PATH=${HOME}/opt/curl/bin/curl
export HOMEBREW_GIT_PATH=${HOME}/opt/git/bin/git
export HOMEBREW_PREFIX=${HOME}/.linuxbrew
export HOMEBREW_CELLAR=${HOME}/.linuxbrew/Cellar
export HOMEBREW_REPOSITORY=${HOME}/.linuxbrew/Homebrew
export MANPATH=${HOME}/.linuxbrew/share/man${MANPATH+:$MANPATH}
export INFOPATH=${HOME}/.linuxbrew/share/info:${INFOPATH:-}
export PATH=${HOME}/.linuxbrew/opt/binutils/bin:${HOME}/opt/curl/bin:${HOME}/opt/git/bin:${HOME}/opt/gettext/bin:${HOME}/opt/ssl/bin:${HOME}/.linuxbrew/bin:${HOME}/.linuxbrew/sbin${PATH+:$PATH}
それぞれの環境変数の意味は、以下のようになります。
環境変数名 | 意味 | 今回の設定値 |
---|---|---|
HOMEBREW_FORCE_BREWED_GIT | Homebrewにインストールされているgit の利用を強制する | Falseを表す意味で(空欄)とする。 ※ソースコードからビルドした git を利用したいため。 |
HOMEBREW_FORCE_BREWED_CURL | Homebrewにインストールされているcurlの利用を強制する | Falseを表す意味で(空欄)とする。 ※ソースコードからビルドした curl を利用したいため。 |
HOMEBREW_CURL_PATH | curl のパス | コードにある通り |
HOMEBREW_GIT_PATH | git のパス | 同上 |
HOMEBREW_PREFIX | Homebrewのprefix | コードにある通り ※Homebrewインストール後、下記のコマンドで得られたものをベースに設定 ~/.linuxbrew/bin/brew shellenv |
HOMEBREW_CELLAR | CELLARのパス | 同上 |
HOMEBREW_REPOSITORY | REPOSITORYのパス | 同上 |
MANPATH | manファイルのパス | 同上 |
INFOPATH | infoファイルのパス | 同上 |
PATH | ライブラリ等のインストール先 | コードにある通り。詳細は下記の通り。 ・ ${HOME}/.linuxbrew/opt/binutils/bin python3のインストール時に参照する ・ ${HOME}/opt/curl/bin curl実行時に参照する ・ ${HOME}/opt/git/bin:${HOME}/opt/gettext/bin git実行時に参照する ・ ${HOME}/opt/ssl/bin openssl利用時に参照する ・ ${HOME}/.linuxbrew/bin:${HOME}/.linuxbrew/sbin Homebrew実行時に参照する |
その後、sourceコマンドを用いてパスを有効化します。
source .bash_profile
ディレクトリ作成
下記のコマンドを実行し、必要なディレクトリを作成します。
mkdir -p ~/opt/curl
mkdir -p ~/opt/git
mkdir -p ~/opt/gettext
mkdir -p ~/opt/ssl
mkdir ~/_tmp
依存ライブラリのインストール
以降では、依存ライブラリをインストールしていきます。
作業ディレクトリへの移動・環境変数の設定
作業ディレクトリに移動します。
また、ビルド時のオプションも環境変数に設定しておきます。
cd ~/_tmp
export CFLAGS=-fPIC
opensslのインストール
下記のコマンドを実行してください。
wget http://www.openssl.org/source/openssl-1.0.2k.tar.gz
tar xvfz openssl-1.0.2k.tar.gz
cd openssl-1.0.2k
./config shared --prefix=${HOME}/opt/ssl --openssldir=${HOME}/opt/ssl
make
make install
cd -
また、以下のコマンドを実行し、インストール結果を確認しておきます。
openssl version
OpenSSL 1.1.1t 7 Feb 2023
which openssl
~/opt/ssl/bin/openssl
curlのインストール
以下のコマンドを実行します。
wget https://curl.haxx.se/download/curl-7.65.3.tar.gz
tar zxvf curl-7.65.3.tar.gz
cd curl-7.65.3
./configure --with-ssl=${HOME}/opt/ssl --enable-libcurl-option --prefix=${HOME}/opt/curl --enable-shared
make
make install
# add symbolic link (important!)
pushd ~/opt/curl/lib
ln -s ../../ssl/lib/libssl.so.1.0.0 libssl.so.1.0.0
ln -s ../../ssl/lib/libcrypto.so.1.0.0 libcrypto.so.1.0.0
popd
cd -
Homebrew実行時に発生する下記のエラーを回避するために、curl側からopensslのライブラリが参照できるようにする必要があります。
curl: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory
pushd ~/opt/curl/lib
ln -s ../../ssl/lib/libssl.so.1.0.0 libssl.so.1.0.0
ln -s ../../ssl/lib/libcrypto.so.1.0.0 libcrypto.so.1.0.0
popd
上記の設定を行っておくことで、Homebrewがソースコードからビルドしたcurl
を利用してくれるようになります。
また、以下のコマンドを実行し、インストール結果を確認しておきます。
curl -V
curl 7.65.3 (x86_64-pc-linux-gnu) libcurl/7.65.3 OpenSSL/1.0.2k zlib/1.2.7
Release-Date: 2019-07-19
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS HTTPS-proxy Largefile libz NTLM NTLM_WB SSL TLS-SRP UnixSockets
which curl
~/opt/curl/bin/curl
gettextのインストール
下記のコマンドを実行してください。
wget https://ftp.gnu.org/pub/gnu/gettext/gettext-0.21.tar.gz
tar zxvf gettext-0.21.tar.gz
cd gettext-0.21
./configure --prefix=${HOME}/opt/gettext
make
make install
cd -
gitのインストール
以下のコマンドを実行します。
wget https://www.kernel.org/pub/software/scm/git/git-2.17.0.tar.gz
tar zxvf git-2.17.0.tar.gz
cd git-2.17.0
./configure --prefix=${HOME}/opt/git --with-openssl=${HOME}/opt/ssl --with-curl=${HOME}/opt/curl
make
make install
cd -
また、以下のコマンドを実行し、インストール結果を確認しておきます。
git --version
git version 2.17.0
which git
~/opt/git/bin/git
作業ディレクトリの削除
一通りインストールが完了したため、作業ディレクトリを削除しておきます。
cd ~
rm -rf ~/_tmp
Homebrewのインストール
下記のコマンドを実行し、Homebrewをインストールします。
mkdir ~/.linuxbrew
git clone https://github.com/Homebrew/brew ~/.linuxbrew/Homebrew
mkdir ~/.linuxbrew/bin
ln -s ~/.linuxbrew/Homebrew/bin/brew ~/.linuxbrew/bin
また、以下のコマンドを実行し、インストール結果を確認しておきます。
brew help
Example usage:
brew search TEXT|/REGEX/
brew info [FORMULA|CASK...]
brew install FORMULA|CASK...
brew update
brew upgrade [FORMULA|CASK...]
brew uninstall FORMULA|CASK...
brew list [FORMULA|CASK...]
Troubleshooting:
brew config
brew doctor
brew install --verbose --debug FORMULA|CASK
Contributing:
brew create URL [--no-fetch]
brew edit [FORMULA|CASK...]
Further help:
brew commands
brew help [COMMAND]
man brew
https://docs.brew.sh
Pythonのインストール
本題となるPythonのインストールを進めます。
ただし、いきなりPythonをインストールすると、以下のようなメッセージが表示されてインストールできないため、先に依存関係を解決しておきます。
checking whether the C compiler works... no
configure: error: in `/tmp/pkg-config-22221111-63960-1oyxigf/pkg-config-0.29.2':
configure: error: C compiler cannot create executables
依存ライブラリbinutilsのインストール
下記のコマンドを実行します。
brew install binutils
インストール後、下記のようなメッセージが表示されるため、追加で環境変数を設定します。
binutils is keg-only, which means it was not symlinked into ${HOME}/.linuxbrew,
because it shadows the host toolchain.
If you need to have binutils first in your PATH, run:
echo 'export PATH="${HOME}/.linuxbrew/opt/binutils/bin:$PATH"' >> ${HOME}/.bash_profile
For compilers to find binutils you may need to set:
export LDFLAGS="-L${HOME}/.linuxbrew/opt/binutils/lib"
export CPPFLAGS="-I${HOME}/.linuxbrew/opt/binutils/include"
# add environment variables
export LDFLAGS="-L${HOME}/.linuxbrew/opt/binutils/lib"
export CPPFLAGS="-I${HOME}/.linuxbrew/opt/binutils/include"
${HOME}/.linuxbrew/opt/binutils/binは、最初のPATH設定時に実施済みのため、以下の2点だけ追加で実施すればOKです。
- export LDFLAGS="-L${HOME}/.linuxbrew/opt/binutils/lib"
- export CPPFLAGS="-I${HOME}/.linuxbrew/opt/binutils/include"
Pythonのインストール
今回は、Python3.11をインストールするため、下記のコマンドを実行します。
brew install python@3.11
他のバージョンをインストールしたい場合、search引数を指定することで、Homebrewでインストール可能なバージョンを確認できます。
brew search python@3
boost-python3
python@3.10
python@3.11
python@3.7
python@3.8
python@3.9
ipython
bpython
jython
cython
また、以下のコマンドを実行し、インストール結果を確認しておきます。
python3 -V
Python 3.11.3
pip3 -V
pip 23.0.1 from ${HOME}/.linuxbrew/opt/python@3.11/lib/python3.11/site-packages/pip (python 3.11)
pipenvのインストール
最後にpipenvをインストールしておきます。
brew install pipenv
また、以下のコマンドを実行し、インストール結果を確認しておきます。
pipenv --version
pipenv, version 2023.5.19
よくある質問
ここでは、私が作業を進める中で遭遇した問題をよくある質問として紹介しておきます。
Homebrew実行時にcurlのエラーが消えない
下記のエラーが解消されない場合、curl側からopensslのライブラリが参照できていることを確認してください。
Error: Please update your system curl or set HOMEBREW_CURL_PATH to a newer version.
Minimum required version: 7.41.0
Your curl version: 7.29.0
Your curl executable: /usr/bin/curl
確認方法
下記のコマンドを実行します。
ldd opt/curl/bin/curl
linux-vdso.so.1 => (0x00007ffc06bab123)
libcurl.so.4 => ${HOME}/opt/curl/lib/libcurl.so.4 (0x00007f7102805132)
libssl.so.1.0.0 => not found
libcrypto.so.1.0.0 => not found
libz.so.1 => /lib64/libz.so.1 (0x00007f7101c2f623)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7201913723)
libc.so.6 => /lib64/libc.so.6 (0x00007f7103545523)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7501341023)
/lib64/ld-linux-x86-64.so.2 (0x00007f7102678000)
libssl.so.1.0.0やlibcrypto.so.1.0.0が「not found」となる場合、opensslのライブラリが参照できていないことなります。
解消方法
下記のコマンドを実行し、シンボリックリンクを作成してください。
pushd ~/opt/curl/lib
ln -s ../../ssl/lib/libssl.so.1.0.0 libssl.so.1.0.0
ln -s ../../ssl/lib/libcrypto.so.1.0.0 libcrypto.so.1.0.0
popd
先ほどの確認方法に示したコマンドを実行すると「not found」が無くなっていると思います。
ldd opt/curl/bin/curl
linux-vdso.so.1 => (0x00007ffc06bab123)
libcurl.so.4 => ${HOME}/opt/curl/lib/libcurl.so.4 (0x00007f7102805132)
libssl.so.1.0.0 => ${HOME}/opt/curl/lib/libssl.so.1.0.0 (0x00007f7102a93153) # <- updated
libcrypto.so.1.0.0 => ${HOME}/opt/curl/lib/libcrypto.so.1.0.0 (0x00007f710cd45771) # <- updated
libz.so.1 => /lib64/libz.so.1 (0x00007f7101c2f623)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7201913723)
libc.so.6 => /lib64/libc.so.6 (0x00007f7103545523)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7501341023)
/lib64/ld-linux-x86-64.so.2 (0x00007f7102678000)
Pythonインストール時にエラーが発生する
binutilsをインストールしても、下記のエラーが発生することがあります。
checking whether the C compiler works... no
configure: error: in `/tmp/pkg-config-22221111-63960-1oyxigf/pkg-config-0.29.2':
configure: error: C compiler cannot create executables
原因究明
私の環境では、binutilsが再インストールされ、ディレクトリ名が変わってしまっていたことが問題でした。
ls .linuxbrew/opt/binutils -al
lrwxrwxrwx 1 xs012 members 22 11月 11 00:00 .linuxbrew/opt/binutils -> ../Cellar/binutils/2.40
ls .linuxbrew/Cellar/
2.40.reinstall
解消方法
binutilsを手動で再インストールすることで解決しました。
brew uninstall binutils
brew install binutils
まとめ
今回は、XserverでPython+pipenvの環境を構築する方法について解説しました。
特殊な環境下での作業のため、苦戦することが多かったですが、最低限の環境は構築できました。
引き続き、Homebrewを用いて必要なライブラリ(mariadbやmariadb-connector-cなどのデータベースを操作するライブラリ等)をインストールしていきたいと思います。
素早く環境構築したい方へ
環境構築が比較的容易で、共有サーバよりも、カスタマイズの自由度が高いものを求めている場合、仮想専用サーバ(VPS)を利用することをおすすめします。
詳細は、以下の記事をご覧ください。
【比較】おすすめのVPS 4選
続きを見る