tag:crieit.net,2005:https://crieit.net/tags/CentOS/feed 「CentOS」の記事 - Crieit Crieitでタグ「CentOS」に投稿された最近の記事 2022-01-09T23:55:22+09:00 https://crieit.net/tags/CentOS/feed tag:crieit.net,2005:PublicArticle/17929 2022-01-09T23:55:22+09:00 2022-01-09T23:55:22+09:00 https://crieit.net/posts/centos-cp-interactive-evenif-force-20220109 cp コマンドで強制上書きする際に気を付けること <p>CentOS 系で cp コマンドで強制上書きをする際のメモです。</p> <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>タイムゾーンを変更するために次のようなコマンドを実行しました。</p> <pre><code class="bash"># cp -pf /usr/share/zoneinfo/Japan /etc/localtime cp: overwrite `/etc/localtime'? </code></pre> <p>すると、 <code>-f</code> オプションで強制上書きするはずなのに上書きするかを聞かれてしまいました。</p> <h2 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h2> <p>これは <code>cp</code> コマンドが <code>cp -i</code> のエイリアスとなっているため。</p> <p>つまり、デフォルトでインタラクティブ(対話式)になっているようです。そのため、仮に <code>-f</code> を付けても <code>-i</code> の方が優先され、上書きするか確認してくる、というわけです。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <p><code>cp</code> コマンドの頭に <code>\</code> を付けるとエイリアスが無効になるため、 <code>-i</code> が外れます。</p> <pre><code class="bash"># \cp -pf /usr/share/zoneinfo/Japan /etc/localtime </code></pre> <p>しばらく気付きませんでした……。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/owlbeck/items/6752a6f1b3fb58d0cb17">CentOSのcpコマンドで強制的にファイルを上書きする - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="http://dotnsf.blog.jp/archives/2918928.html">Linux の cp コマンドで強制上書き : まだプログラマーですが何か?</a></li> <li><a target="_blank" rel="nofollow noopener" href="http://blog.livedoor.jp/harukisan7/archives/27306085.html">cp コマンドで強制上書きする時に気をつけること。 : リア充キラキラ系のnoteです。@kuromitsu_ka</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17898 2021-12-29T00:16:11+09:00 2021-12-29T00:17:49+09:00 https://crieit.net/posts/test-centos8-lamp-for-almalinux-in-docker-20211229 (Docker) Almalinux を見据えて CentOS8 での環境構築を試験してみる <p>手前味噌で恐縮ですが、自作の LAMP環境 を検証する Docker Compose について。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/docker_compose_ambergrease">GitHub - arm-band/docker_compose_ambergrease</a></li> </ul> <p>イメージを CentOS7 ベースで構築しているので、いずれは AlmaLinux なり Rocky Linux なりに移行しなければならないことは分かっていました。</p> <p>そこで、その以降を見据えて残り数日の命の CentOS8 で試験してみることにしました。なぜ AlmaLinux や Rocky Linux ではなくわざわざ CentOS8 かというと、いきなりそれらのOSに飛びついて何らかの不具合が発生したときに原因の切り分けで苦労するならば、まだ同じシリーズで差分が少ない (と想定される) CentOS8 で試験して、問題なければ次に進もう、という段階的な試験を想定したためです。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <pre><code class="bash">docker run --name php7_cent8 -it centos:centos8 /bin/bash </code></pre> <p>まずはイメージを取得し、 bash に入ります。</p> <h3 id="Apache + PHP"><a href="#Apache+%2B+PHP">Apache + PHP</a></h3> <p>最初は Apache + PHP 。こちらについては、以前 <a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/2020/02/23/centos8-lamp-install-note/">CentOS8 をインストールして遊んだとき</a>にremiリポジトリの入り方が CentOS7 とは異なることが分かっていたので、多少手を加える必要があるだろう、と踏んでいました。</p> <pre><code class="bash"># \cp -pf /usr/share/zoneinfo/Japan /etc/localtime # </code></pre> <p>これは問題なし。</p> <pre><code class="bash"># dnf -y update && yum -y install epel-release sudo less iproute httpd-devel zip unzip openssl mod_ssl ## 略 Installed: apr-1.6.3-12.el8.x86_64 apr-devel-1.6.3-12.el8.x86_64 apr-util-1.6.1-6.el8.x86_64 apr-util-bdb-1.6.1-6.el8.x86_64 apr-util-devel-1.6.1-6.el8.x86_64 apr-util-openssl-1.6.1-6.el8.x86_64 brotli-1.0.6-3.el8.x86_64 centos-logos-httpd-85.8-2.el8.noarch cyrus-sasl-2.1.27-5.el8.x86_64 cyrus-sasl-devel-2.1.27-5.el8.x86_64 epel-release-8-11.el8.noarch expat-devel-2.2.5-4.el8.x86_64 groff-base-1.22.3-18.el8.x86_64 httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 httpd-devel-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 httpd-filesystem-2.4.37-43.module_el8.5.0+1022+b541f3b1.noarch httpd-tools-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 libdb-devel-5.3.28-42.el8_4.x86_64 libpath_utils-0.2.1-39.el8.x86_64 libpkgconf-1.4.2-1.el8.x86_64 libtalloc-2.3.2-1.el8.x86_64 mailcap-2.1.48-3.el8.noarch mod_http2-1.15.7-3.module_el8.4.0+778+c970deab.x86_64 mod_ssl-1:2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 ncurses-6.1-9.20180224.el8.x86_64 openldap-devel-2.4.46-18.el8.x86_64 perl-Carp-1.42-396.el8.noarch perl-Data-Dumper-2.167-399.el8.x86_64 perl-Digest-1.17-395.el8.noarch perl-Digest-MD5-2.55-396.el8.x86_64 perl-Encode-4:2.97-3.el8.x86_64 perl-Errno-1.28-420.el8.x86_64 perl-Exporter-5.72-396.el8.noarch perl-File-Path-2.15-2.el8.noarch perl-File-Temp-0.230.600-1.el8.noarch perl-Getopt-Long-1:2.50-4.el8.noarch perl-HTTP-Tiny-0.074-1.el8.noarch perl-IO-1.38-420.el8.x86_64 perl-IO-Socket-IP-0.39-5.el8.noarch perl-IO-Socket-SSL-2.066-4.module_el8.3.0+410+ff426aa3.noarch perl-MIME-Base64-3.15-396.el8.x86_64 perl-Mozilla-CA-20160104-7.module_el8.3.0+416+dee7bcef.noarch perl-Net-SSLeay-1.88-1.module_el8.3.0+410+ff426aa3.x86_64 perl-PathTools-3.74-1.el8.x86_64 perl-Pod-Escapes-1:1.07-395.el8.noarch perl-Pod-Perldoc-3.28-396.el8.noarch perl-Pod-Simple-1:3.35-395.el8.noarch perl-Pod-Usage-4:1.69-395.el8.noarch perl-Scalar-List-Utils-3:1.49-2.el8.x86_64 perl-Socket-4:2.027-3.el8.x86_64 perl-Storable-1:3.11-3.el8.x86_64 perl-Term-ANSIColor-4.06-396.el8.noarch perl-Term-Cap-1.17-395.el8.noarch perl-Text-ParseWords-3.30-395.el8.noarch perl-Text-Tabs+Wrap-2013.0523-395.el8.noarch perl-Time-Local-1:1.280-1.el8.noarch perl-URI-1.73-3.el8.noarch perl-Unicode-Normalize-1.25-396.el8.x86_64 perl-constant-1.33-396.el8.noarch perl-interpreter-4:5.26.3-420.el8.x86_64 perl-libnet-3.11-3.el8.noarch perl-libs-4:5.26.3-420.el8.x86_64 perl-macros-4:5.26.3-420.el8.x86_64 perl-parent-1:0.237-1.el8.noarch perl-podlators-4.11-1.el8.noarch perl-threads-1:2.21-2.el8.x86_64 perl-threads-shared-1.58-2.el8.x86_64 pkgconf-1.4.2-1.el8.x86_64 pkgconf-m4-1.4.2-1.el8.noarch pkgconf-pkg-config-1.4.2-1.el8.x86_64 sscg-2.3.3-14.el8.x86_64 sudo-1.8.29-7.el8_4.1.x86_64 unzip-6.0-45.el8_4.x86_64 zip-3.0-23.el8.x86_64 Complete! </code></pre> <p>OK。</p> <pre><code class="bash"># dnf -y upgrade ## 略 Upgraded: epel-release-8-13.el8.noarch Complete! </code></pre> <p>特に大きな差分もなさそうです。OK。</p> <h3 id="remiリポジトリ"><a href="#remi%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA">remiリポジトリ</a></h3> <pre><code class="bash"># rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm Retrieving http://rpms.famillecollet.com/enterprise/remi-release-8.rpm warning: /var/tmp/rpm-tmp.hlvLxe: Header V4 RSA/SHA256 Signature, key ID 5f11735a: NOKEY Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:remi-release-8.5-2.el8.remi ################################# [100%] # rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 # </code></pre> <p>OK。 CentOS8 用のリポジトリに切り替えました。鍵についてはすぐ <code>RPM-GPG-KEY-remi2022</code> にしなければならないでしょうけど。</p> <h4 id="dnf"><a href="#dnf">dnf</a></h4> <pre><code class="bash"># dnf config-manager --enable remi && dnf config-manager --enable remi-php74 No such command: config-manager. Please use /usr/bin/dnf --help It could be a DNF plugin command, try: "dnf install 'dnf-command(config-manager)'" </code></pre> <p><code>remi-php74</code> に指定で躓くかと思いきや、そもそも <code>config-manager</code> がない、と?</p> <p>元々は <code>yum-config-manager</code> だったのですが、 CentOS8 であれば <code>dnf</code> ベースの方が良いだろう、ということで置き換えてはみましたが、ダメですか……。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://blog.trippyboy.com/2021/terraform/almalinux%E3%81%ABterraform%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92yum%E3%81%A7%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%81%AE%E5%B7%BB/">Almalinuxにterraformコマンドをyumで導入するの巻 - TrippyBoyの愉快な日々</a></li> </ul> <p>こちらより <code>dnf install -y dnf-plugins-core</code> してみます。</p> <pre><code class="bash"># dnf install dnf-plugins-core ## 略 Installed: dbus-glib-0.110-2.el8.x86_64 dnf-plugins-core-4.0.21-3.el8.noarch python3-dateutil-1:2.6.1-6.el8.noarch python3-dbus-1.2.4-15.el8.x86_64 python3-dnf-plugins-core-4.0.21-3.el8.noarch python3-six-1.11.0-8.el8.noarch Complete! </code></pre> <p>OK。</p> <h4 id="remi + PHP"><a href="#remi+%2B+PHP">remi + PHP</a></h4> <pre><code class="bash"># dnf config-manager --enable remi && dnf config-manager --enable remi-php74 Error: No matching repo to modify: remi-php74. </code></pre> <p>……やはり <code>remi-php74</code> で引っかかりましたか。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://mebee.info/2020/03/12/post-7365/">CentOs8 php7.4をインストールする | mebee</a></li> </ul> <p>……想定していたものとは少し違うやり方ですが、試してみましょう。</p> <pre><code class="bash"># dnf module reset php ## 略 Remi's RPM repository for Enterprise Linux 8 - x86_64 598 kB/s | 3.9 MB 00:06 Last metadata expiration check: 0:00:03 ago on DDD dd mmm yyyy hh:ii:ss AM UTC. Dependencies resolved. Nothing to do. Complete! </code></pre> <p>OK。</p> <pre><code class="bash"># dnf module install -y php:remi-7.4 ## 略 Installed: libedit-3.1-23.20170329cvs.el8.x86_64 libxslt-1.1.32-6.el8.x86_64 nginx-filesystem-1:1.14.1-9.module_el8.0.0+184+e34fea82.noarch oniguruma5php-6.9.7.1-1.el8.remi.x86_64 php-cli-7.4.27-1.el8.remi.x86_64 php-common-7.4.27-1.el8.remi.x86_64 php-fpm-7.4.27-1.el8.remi.x86_64 php-json-7.4.27-1.el8.remi.x86_64 php-mbstring-7.4.27-1.el8.remi.x86_64 php-xml-7.4.27-1.el8.remi.x86_64 Complete! # php --version PHP 7.4.27 (cli) (built: Dec 14 2021 17:17:06) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies </code></pre> <p>OK。入りましたね。これに従い該当箇所を書き換えます。</p> <pre><code class="dockerfile"># enable repository remi & remi-php74 #RUN dnf config-manager --enable remi && dnf config-manager --enable remi-php74 # disable default module RUN dnf module reset -y php RUN dnf module install -y php:remi-7.4 ## 略 # disable repository remi & remi-php74 #RUN dnf config-manager --disable remi && dnf config-manager --disable remi-php74 </code></pre> <p><code>config-manager</code> によるリポジトリ使用のオン・オフの切り替えを削除しました。</p> <pre><code class="bash"># dnf -y install php php-devel php-pdo php-mysqlnd php-mbstring php-gd php-pear php-pecl-apc-devel zlib-devel php-xml php-mcrypt php-pecl-xdebug ## 略 Installed: autoconf-2.69-29.el8.noarch automake-1.16.1-7.el8.noarch cmake-filesystem-3.20.2-4.el8.x86_64 cpp-8.5.0-4.el8_5.x86_64 dejavu-fonts-common-2.35-7.el8.noarch dejavu-sans-fonts-2.35-7.el8.noarch emacs-filesystem-1:26.1-7.el8.noarch fontconfig-2.13.1-4.el8.x86_64 fontpackages-filesystem-1.44-22.el8.noarch freetype-2.9.1-4.el8_3.1.x86_64 fribidi-1.0.4-8.el8.x86_64 gcc-8.5.0-4.el8_5.x86_64 gcc-c++-8.5.0-4.el8_5.x86_64 gd3php-2.3.3-4.el8.remi.x86_64 glibc-devel-2.28-164.el8.x86_64 glibc-headers-2.28-164.el8.x86_64 graphite2-1.3.10-10.el8.x86_64 harfbuzz-1.7.5-3.el8.x86_64 isl-0.16.1-6.el8.x86_64 jbigkit-libs-2.1-14.el8.x86_64 kernel-headers-4.18.0-348.2.1.el8_5.x86_64 keyutils-libs-devel-1.5.10-9.el8.x86_64 krb5-devel-1.18.2-14.el8.x86_64 libX11-1.6.8-5.el8.x86_64 libX11-common-1.6.8-5.el8.noarch libXau-1.0.9-3.el8.x86_64 libXpm-3.5.12-8.el8.x86_64 libcom_err-devel-1.45.6-2.el8.x86_64 libimagequant-2.12.5-1.el8.x86_64 libjpeg-turbo-1.5.3-12.el8.x86_64 libkadm5-1.18.2-14.el8.x86_64 libmcrypt-2.5.8-26.el8.x86_64 libmpc-1.1.0-9.1.el8.x86_64 libpng-2:1.6.34-5.el8.x86_64 libraqm-0.7.0-4.el8.x86_64 libselinux-devel-2.9-5.el8.x86_64 libsepol-devel-2.9-3.el8.x86_64 libsodium-1.0.18-2.el8.x86_64 libstdc++-devel-8.5.0-4.el8_5.x86_64 libtiff-4.0.9-20.el8.x86_64 libtool-2.4.6-25.el8.x86_64 libverto-devel-0.3.0-5.el8.x86_64 libwebp-1.0.0-5.el8.x86_64 libxcb-1.13.1-1.el8.x86_64 libxcrypt-devel-4.1.1-6.el8.x86_64 libxml2-devel-2.9.7-9.el8_4.2.x86_64 m4-1.4.18-7.el8.x86_64 make-1:4.2.1-10.el8.x86_64 openssl-devel-1:1.1.1k-5.el8_5.x86_64 pcre2-devel-10.32-2.el8.x86_64 pcre2-utf16-10.32-2.el8.x86_64 pcre2-utf32-10.32-2.el8.x86_64 perl-Thread-Queue-3.13-1.el8.noarch php-7.4.27-1.el8.remi.x86_64 php-devel-7.4.27-1.el8.remi.x86_64 php-fedora-autoloader-1.0.1-2.el8.remi.noarch php-gd-7.4.27-1.el8.remi.x86_64 php-mysqlnd-7.4.27-1.el8.remi.x86_64 php-opcache-7.4.27-1.el8.remi.x86_64 php-pdo-7.4.27-1.el8.remi.x86_64 php-pear-1:1.10.13-1.el8.remi.noarch php-pecl-apcu-5.1.21-1.el8.remi.7.4.x86_64 php-pecl-apcu-devel-5.1.21-1.el8.remi.7.4.x86_64 php-pecl-mcrypt-1.0.4-1.el8.remi.7.4.x86_64 php-pecl-xdebug-2.9.8-1.el8.remi.7.4.x86_64 php-process-7.4.27-1.el8.remi.x86_64 php-sodium-7.4.27-1.el8.remi.x86_64 xz-devel-5.2.4-3.el8.x86_64 zlib-devel-1.2.11-17.el8.x86_64 Complete! </code></pre> <p>OK。</p> <pre><code class="bash"># php -r &quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&quot; && php composer-setup.php && php -r &quot;unlink('composer-setup.php');&quot; && mv composer.phar /usr/local/bin/composer All settings correct for using Composer Downloading... Composer (version 2.2.1) successfully installed to: /etc/yum.repos.d/composer.phar Use it: php composer.phar # composer --version Composer version 2.2.1 2021-12-22 22:21:31 </code></pre> <p>Composer も入りました。</p> <pre><code class="bash"># mkdir /var/log/php # chown apache /var/log/php # chmod 755 /var/log/php # mkdir -p /etc/ssl/private </code></pre> <p>まあこの辺りは普通に。</p> <h3 id="SSL"><a href="#SSL">SSL</a></h3> <pre><code class="bash"># openssl req -new -newkey rsa:2048 -nodes -out /etc/ssl/private/server.csr -keyout /etc/ssl/private/server.key -subj &quot;/C=/ST=/L=/O=/OU=/CN=*.lvh.me&quot; ## 略 # openssl x509 -days 365 -req -signkey /etc/ssl/private/server.key -in /etc/ssl/private/server.csr -out /etc/ssl/private/server.crt Signature ok subject=CN = *.lvh.me Getting Private key </code></pre> <p>OK。</p> <h3 id="Apache の設定ファイル"><a href="#Apache+%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB">Apache の設定ファイル</a></h3> <h4 id="ssl.conf"><a href="#ssl.conf">ssl.conf</a></h4> <pre><code class="bash"># cat /etc/httpd/conf.d/ssl.conf ## 略 </code></pre> <p>表示させたSSL用の設定を現行のものと差し替えます。ただし、現行の設定をなるべく引き継ぐように。これは他の設定ファイルも同様です。</p> <pre><code class="conf">- SSLRandomSeed startup file:/dev/urandom 256 - SSLRandomSeed connect builtin - SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA </code></pre> <p>現行にあったこれらの行は削除。</p> <pre><code class="conf">+ SSLHonorCipherOrder on </code></pre> <p>これは新しく追加されていました。</p> <pre><code class="conf">SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 </code></pre> <p>プロトコルについては念のため現行の設定を引き継ぎ。流石にもう SSLv2 なんて存在しないでしょうけど……。</p> <pre><code class="conf">- <Files ~ "\.(cgi|shtml|phtml|php3?)$"> + <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars - </Files> + </FilesMatch> </code></pre> <p>微妙にディレクティブの表現が変わっていますが、影響はなさそうなので変更を受け入れます。</p> <h4 id="php.conf"><a href="#php.conf">php.conf</a></h4> <pre><code class="bash"># cat /etc/httpd/conf.d/php.conf ## 略 # Redirect to local php-fpm if mod_php (5 or 7) is not available <IfModule !mod_php5.c> <IfModule !mod_php7.c> # Enable http authorization headers SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 <FilesMatch \.(php|phar)$> SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" </FilesMatch> </IfModule> </IfModule> </code></pre> <p>こちらは最後の部分に追記がありますね。これはそのまま受け入れ。</p> <h4 id="php.ini"><a href="#php.ini">php.ini</a></h4> <pre><code class="bash"># cat /etc/php.ini ## 略 </code></pre> <p>こちらも設定を引き継ぎ、といっても現行の設定と変更点はなく(自前の設定を引き継いだ) 差分としてはコメントの文字列くらい。</p> <h3 id="AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message"><a href="#AH00558%3A+httpd%3A+Could+not+reliably+determine+the+server%27s+fully+qualified+domain+name%2C+using+192.0.2.1.+Set+the+%27ServerName%27+directive+globally+to+suppress+this+message">AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message</a></h3> <p>Apache を起動しようとしたところ、</p> <blockquote> <p>AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message</p> </blockquote> <p>のエラーメッセージがログに記録されて起動してこない現象に遭遇。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sachiko-kame/items/a6deebbad207d627b598">[Docker]AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using ***.***.*.*. Set the 'ServerName' directive globally to suppress this message - Qiita</a></li> </ul> <p>そういえば元々の Dockerfile には記述していましたが、 <code>httpd.conf</code> への追記をしていませんでした。</p> <pre><code class="bash">echo ServerName www.example.com:80 >> /etc/httpd/conf/httpd.conf </code></pre> <p>これでOK。</p> <pre><code class="bash"># httpd -v Server version: Apache/2.4.37 (centos) Server built: Nov 12 2021 04:57:27 </code></pre> <p>バージョンも拾えました。</p> <h3 id="(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed"><a href="#%282%29No+such+file+or+directory%3A+AH02454%3A+FCGI%3A+attempt+to+connect+to+Unix+domain+socket+%2Frun%2Fphp-fpm%2Fwww.sock+%28%2A%29+failed">(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed</a></h3> <p>これで Apache も起動してきたのでブラウザで表示確認、ということで <code>phpinfo()</code> でも表示させようかとファイルを用意して <code>curl</code> してみると……</p> <blockquote> <p>Service Unavailable</p> <p>The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.</p> </blockquote> <p>503エラーが出てしまいました。</p> <blockquote> <p>(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed</p> </blockquote> <p>Apache のエラーログには上述のログが記録されていました。</p> <p>今までとは異なる方法で PHP をインストールしたら、どうやら php-fpm (CGIモード) で動作しようとしてしまっているようです。</p> <p>今回の環境ではCGI版かモジュール版かはあまり考慮しておらず、Webサーバも Apache のためモジュール版でも良いと判断。</p> <p>動作を切り替えます。</p> <pre><code class="bash"># less /etc/httpd/conf/httpd.conf ## 略 Include conf.modules.d/*.conf </code></pre> <p>念のためモジュール読み込みの記述があることを確認。</p> <pre><code class="bash"># ls /etc/httpd/conf.modules.d/ 00-base.conf 00-lua.conf 00-optional.conf 00-ssl.conf 01-cgi.conf 10-proxy_h2.conf README 00-dav.conf 00-mpm.conf 00-proxy.conf 00-systemd.conf 10-h2.conf 15-php.conf </code></pre> <p>関係しそうなのは <code>00-mpm.conf</code>, <code>01-cgi.conf</code>, <code>15-php.conf</code> 辺りでしょうか。</p> <pre><code class="bash"># less /etc/httpd/conf.modules.d/15-php.conf # Cannot load both php5 and php7 modules <IfModule !mod_php5.c> <IfModule prefork.c> LoadModule php7_module modules/libphp7.so </IfModule> </IfModule> </code></pre> <p>ここはそのまま。</p> <pre><code class="bash"># less /etc/httpd/conf.modules.d/01-cgi.conf # This configuration file loads a CGI module appropriate to the MPM # which has been configured in 00-mpm.conf. mod_cgid should be used # with a threaded MPM; mod_cgi with the prefork MPM. <IfModule mpm_worker_module> LoadModule cgid_module modules/mod_cgid.so </IfModule> <IfModule mpm_event_module> LoadModule cgid_module modules/mod_cgid.so </IfModule> <IfModule mpm_prefork_module> LoadModule cgi_module modules/mod_cgi.so </IfModule> </code></pre> <p>ここもそのまま。</p> <pre><code class="bash"># less /etc/httpd/conf.modules.d/00-mpm.conf # Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines. See the httpd.conf(5) man # page for more information on changing the MPM. # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html # # NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux # boolean should be enabled, to allow graceful stop/shutdown. # #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # #LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # LoadModule mpm_event_module modules/mod_mpm_event.so </code></pre> <p>変更するのはここ。</p> <pre><code>- #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so + LoadModule mpm_prefork_module modules/mod_mpm_prefork.so - LoadModule mpm_event_module modules/mod_mpm_event.so # LoadModule mpm_event_module modules/mod_mpm_event.so </code></pre> <p>上述のうち2ヶ所を反転させます。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.out48.com/archives/5636/">CentOSにApacheとPHP入れてPHPファイルを表示しようとしたら503エラー Output48</a></li> </ul> <p>これでOK。起動も確認できました。</p> <p>テンプレートとして上述を反転させた <code>00-mpm.conf</code> を用意し、エントリポイントでファイルコピーして設定を上書きすることで対処しました。</p> <p><a href="https://crieit.now.sh/upload_images/abe7eb81a2b7f6580feb784cb81cdf1361cb21ea49eef.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/abe7eb81a2b7f6580feb784cb81cdf1361cb21ea49eef.jpg?mw=700" alt="最終的に AlmaLinux の Docker Compose で起動、確認した phpinfo() の画面" /></a></p> <p>最終的に AlmaLinux の Docker Compose を作成して起動し、ブラウザで該当の PHPファイル にアクセスし、 <code>phpinfo()</code> の画面が表示されることを確認できました。OK。</p> <h3 id="SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty"><a href="#SSLCertificateFile%3A+file+%27%2Fetc%2Fpki%2Ftls%2Fcerts%2Flocalhost.crt%27+does+not+exist+or+is+empty">SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty</a></h3> <p>上述のエラーの他に</p> <blockquote> <p>SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty</p> </blockquote> <p>localhost のSSL証明書がない、というエラーにも遭遇しました。</p> <p>なければ作れば良いだけ、上述で</p> <pre><code class="bash">echo ServerName www.example.com:80 >> /etc/httpd/conf/httpd.conf </code></pre> <p>としているので、このダミードメインを使います。</p> <pre><code class="bash"># openssl req -new -newkey rsa:2048 -nodes -out /etc/pki/tls/certs/localhost.csr -keyout /etc/pki/tls/private/localhost.key -subj &quot;/C=/ST=/L=/O=/OU=/CN=www.example.com&quot; ## 略 # openssl x509 -days 365 -req -signkey /etc/pki/tls/private/localhost.key -in /etc/pki/tls/certs/localhost.csr -out /etc/pki/tls/certs/localhost.crt Signature ok subject=CN = www.example.com Getting Private key </code></pre> <p>これでOK。 <code>ssl.conf</code> には記述はあるのですが……。</p> <h3 id="MySQL"><a href="#MySQL">MySQL</a></h3> <p>次に MySQL 側を。こちらはほぼ手を加える必要はないという想定です。</p> <pre><code class="bash"># dnf localinstall https://dev.mysql.com/get/mysql80-community-release-el8-2.noarch.rpm ## 略 Package mysql80-community-release-el8-2.noarch is already installed. Dependencies resolved. Nothing to do. Complete! </code></pre> <p>CentOS8 用ということでリポジトリの入れ方を少し変更。</p> <pre><code class="bash"># ls /etc/yum.repo.d/ CentOS-Linux-AppStream.repo CentOS-Linux-Media.repo epel-testing.repo CentOS-Linux-BaseOS.repo CentOS-Linux-Plus.repo mysql-community.repo CentOS-Linux-ContinuousRelease.repo CentOS-Linux-PowerTools.repo mysql-community-source.repo CentOS-Linux-Debuginfo.repo CentOS-Linux-Sources.repo remi-modular.repo CentOS-Linux-Devel.repo epel-modular.repo remi.repo CentOS-Linux-Extras.repo epel-playground.repo remi-safe.repo CentOS-Linux-FastTrack.repo epel.repo CentOS-Linux-HighAvailability.repo epel-testing-modular.repo </code></pre> <p><code>mysql-community.repo</code>, <code>mysql-community-source.repo</code> の2つが追加されたことを確認。</p> <pre><code class="bash"># dnf module disable mysql ## 略 Complete! </code></pre> <p>デフォルトの MySQL がいると邪魔になるので無効化して</p> <pre><code class="bash"># dnf -y install mysql-community-devel mysql-community-server ## 略 Installed: mysql-community-client-8.0.27-1.el8.x86_64 mysql-community-client-plugins-8.0.27-1.el8.x86_64 mysql-community-common-8.0.27-1.el8.x86_64 mysql-community-devel-8.0.27-1.el8.x86_64 mysql-community-libs-8.0.27-1.el8.x86_64 mysql-community-server-8.0.27-1.el8.x86_64 net-tools-2.0-0.52.20160912git.el8.x86_64 Complete! </code></pre> <p>インストール完了。</p> <pre><code class="bash"># mysqld --version /usr/sbin/mysqld Ver 8.0.27 for Linux on x86_64 (MySQL Community Server - GPL) </code></pre> <p>デフォルトでは <code>8.0.26</code> だったバージョンが地味に <code>8.0.27</code> に上がりました。</p> <pre><code class="bash"># grep 'temporary password' /var/log/mysqld.log yyyy-mm-ddThh:ii:ss.zzzzzzZ 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: XXXXXXXXXXXX </code></pre> <p>初期パスワードの出現位置が半角スペース区切りで13番目であることを確認。これはエントリポイントで <code>awk</code> を使って抽出、初期パスワードを環境変数の値で書き換える処理で使用するため個人的には重要ポイント。ここは変更しなくて良さそうです。</p> <pre><code class="bash"># cat /etc/my.cnf [mysqld] ## 略 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid </code></pre> <p>デフォルトで4つパラメータが指定されています。うち3つはテンプレートの設定ファイルに記述がされているので不要、 <code>pid-file</code> だけ現時点では指定がないため、これだけ <code>base.cnf</code> に移植します。</p> <p><code>/etc/my.cnf</code> には上述4つを削除した代わりに <code>!includedir /etc/my.cnf.d</code> を末尾に追加したものを現行の <code>my.cnf</code> と差し替え。</p> <p>これで MySQL 側は良さそうです。</p> <p>なお、 phpMyAdmin は公式イメージをそのまま使っているので変更なし。</p> <p>以上で一通り動作検証できたので、これをベースに AlmaLinux 用に書き換えれば良さそうです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="Docker"><a href="#Docker">Docker</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/almalinux?tab=tags">almalinux Tags | Docker Hub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/centos?tab=tags">centos Tags | Docker Hub</a></li> </ul> <h3 id="AlmaLinux"><a href="#AlmaLinux">AlmaLinux</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://blog.apar.jp/linux/15554/">AlmaLinux 8.4 LAMPサーバインストールメモ【Apache2.4+MySQL8.0+PHP7.4】 | あぱーブログ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yamada-hakase/items/17b41d33e30232b69fe2">AlmaLinuxを使ってみた(後編) - Qiita</a></li> </ul> <h3 id="dnf"><a href="#dnf">dnf</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://blog.trippyboy.com/2021/terraform/almalinux%E3%81%ABterraform%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92yum%E3%81%A7%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%81%AE%E5%B7%BB/">Almalinuxにterraformコマンドをyumで導入するの巻 - TrippyBoyの愉快な日々</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/40937056/dnf-missing-config-manager-command">linux - DNF missing config-manager command - Stack Overflow</a></li> </ul> <h3 id="remi"><a href="#remi">remi</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://rpms.remirepo.net/">Remi's RPM repository</a></li> </ul> <h3 id="AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message"><a href="#AH00558%3A+httpd%3A+Could+not+reliably+determine+the+server%27s+fully+qualified+domain+name%2C+using+192.0.2.1.+Set+the+%27ServerName%27+directive+globally+to+suppress+this+message">AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sachiko-kame/items/a6deebbad207d627b598">[Docker]AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using ***.***.*.*. Set the 'ServerName' directive globally to suppress this message - Qiita</a></li> </ul> <h3 id="PHP"><a href="#PHP">PHP</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://mebee.info/2020/03/12/post-7365/">CentOs8 php7.4をインストールする | mebee</a></li> </ul> <h3 id="(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed"><a href="#%282%29No+such+file+or+directory%3A+AH02454%3A+FCGI%3A+attempt+to+connect+to+Unix+domain+socket+%2Frun%2Fphp-fpm%2Fwww.sock+%28%2A%29+failed">(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/58365479/no-such-file-or-directory-ah02454-fcgi-attempt-to-connect-to-unix-domain-sock">apache - No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /var/run/php/php5.6-fpm.sock (*) failed - Stack Overflow</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.out48.com/archives/5636/">CentOSにApacheとPHP入れてPHPファイルを表示しようとしたら503エラー Output48</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://ja.stackoverflow.com/questions/46727/amazon-linux2%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BCah02454%E3%82%84ah01079%E3%81%AA%E3%81%A9%E3%81%8C%E5%87%BA%E3%81%A6httpd%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93">php - amazon-linux2でエラーAH02454やAH01079などが出てhttpdがうまく起動しません - スタック・オーバーフロー</a></li> </ul> <h3 id="php-fpm"><a href="#php-fpm">php-fpm</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc">nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する - Qiita</a></li> </ul> <h3 id="SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty"><a href="#SSLCertificateFile%3A+file+%27%2Fetc%2Fpki%2Ftls%2Fcerts%2Flocalhost.crt%27+does+not+exist+or+is+empty">SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://daredemose.com/linux/ssl/">SSL/TLS | 初心者向けプログラミング講座</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://hacknote.jp/archives/51779/">いつの間にか作られてる /etc/pki/tls/certs/localhost.crt と /etc/pki/tls/private/localhost.key の謎 | ハックノート</a></li> </ul> <h3 id="MySQL"><a href="#MySQL">MySQL</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yasushi-jp/items/1579c301075d693a2a36">MySQL 8.0 を CentOS 8.1 にインストールする手順 - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16671 2021-02-02T23:45:09+09:00 2021-02-02T23:45:09+09:00 https://crieit.net/posts/centos-repository-yum-config-manager-20210126 CentOS で リポジトリの enable/disabled を切り替える方法 <p>CentOS でリポジトリを切り替える際、今までリポジトリファイルの編集をしていました。</p> <pre><code class="bash"># vi /etc/yum.repos.d/remi.repo [remi] enabled=1 </code></pre> <p><code>remi</code> リポジトリの有効化。</p> <pre><code class="bash"># vi /etc/yum.repos.d/remi-php74.repo [remi-php74] enabled=1 </code></pre> <p><code>remi-php74</code> リポジトリの有効化。</p> <p>この他のやり方としては、 <code>yum</code> や <code>dnf</code> 使用時にリポジトリの <code>enabled</code>, <code>disabled</code> を引数で指定する方法があります。</p> <pre><code class="bash"># yum install --enablerepo=remi-php74 php </code></pre> <p>今回改めて検索したところ、以下のコマンドを発見したのでメモしておきます。</p> <pre><code class="bash"># yum-config-manager --enable remi </code></pre> <p>これでリポジトリファイルを書き換えることなく、 <code>enabled</code>, <code>disabled</code> を切り替えられます。</p> <pre><code class="bash"># yum-config-manager --enable remi # yum-config-manager --enable remi-php74 </code></pre> <p>今更ですが、こんなやり方があったとは……。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/sec-managing_yum_repositories">6.3.5. Yum リポジトリを有効/設定/無効にする方法 Red Hat Enterprise Linux 6 | Red Hat Customer Portal</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16416 2020-12-24T00:28:56+09:00 2020-12-24T00:29:36+09:00 https://crieit.net/posts/ansible-remove-user-and-settings-of-vsftpd-apache-20201224 vsftpd と Apache の設定を削除しLinuxユーザも削除する <p>以前取り上げた<a href="https://crieit.net/posts/ansible-settings-vsftpd-and-apache-20201202">Ansible を使って FTPユーザの作成と Apache の仮想サイトの設定をする</a>の逆方向バージョンです。</p> <p>つまり、</p> <ul> <li>Linuxユーザを削除</li> <li>上記ユーザを vsftpdユーザ からも削除</li> <li>Apache の仮想サイトの設定と該当ディレクトリのデータを全て削除</li> </ul> <p>を行うタスクを作ろう、と考えました。</p> <p>これは、上記のプレイブックを一時的なテスト環境として作った後、削除することも往々にしてあり、手動で削除するのが面倒になってきたからです。</p> <h2 id="前提"><a href="#%E5%89%8D%E6%8F%90">前提</a></h2> <p>テストに利用するサーバは前の記事と同じサーバで、該当プレイブックによって vsftpd や Apache が設定されている、という状況を想定しています。</p> <h2 id="設定"><a href="#%E8%A8%AD%E5%AE%9A">設定</a></h2> <h3 id="ディレクトリ階層"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E9%9A%8E%E5%B1%A4">ディレクトリ階層</a></h3> <pre><code class="bash">PROJECT_ROOT/ ├ workspace/ │ ├ entrypoint.sh │ └ ansible/ │ ├ (諸々元のプレイブックと同じ構造) │ ├ main.yml // Ansible の設定用 playbook │ └ resset.yml // 今回追加した削除用タスク │ ├ docker-compose.yml └ Dockerfile </code></pre> <p>ほぼ前の記事の通り、というか同じプロジェクトをそのまま流用しています。元々の意図が設定用プレイブックに対して設定を元に戻すためのものなので、同じ場所にあった方が都合は良いと考えました。</p> <p>ただ、リセットするためのタスクは設定用タスクほど複雑ではないのでタスクを分割せずに1つのファイルに既述することにしました。</p> <h3 id="ansible/vars/param_vars.yml"><a href="#ansible%2Fvars%2Fparam_vars.yml">ansible/vars/param_vars.yml</a></h3> <pre><code class="yml">username: USERNAME password: Password1234 rootdirectory: sample_site domain: www.sample.jp ipaddress: 192.0.2.1 portnum: 80 </code></pre> <p>上記ディレクトリ構造より、設定用のプレイブックに使用する変数ファイルがあるため、これをそのまま流用します。</p> <h3 id="ansible/resset.yml"><a href="#ansible%2Fresset.yml">ansible/resset.yml</a></h3> <pre><code class="yml">- name: Remove vsftpd and httpd settings become: yes become_user: ADMIN_USER become_method: su hosts: - add_vhost_servers vars_files: ./vars/param_vars.yml tasks: - name: Remove user user: name: "<span>{</span><span>{</span> username <span>}</span><span>}</span>" state: absent remove: yes - name: Remove user in vsftpd user_list blockinfile: path: /etc/vsftpd/user_list create: yes insertafter: EOF marker: "# {mark} ANSIBLE basic setup: <span>{</span><span>{</span> username <span>}</span><span>}</span>" block: "" - name: Remove user_conf file file: path: "/etc/vsftpd/user_conf/<span>{</span><span>{</span> username <span>}</span><span>}</span>" state: absent - name: Restart vsftpd systemd: name: vsftpd.service state: restarted daemon_reload: yes - name: Remove Apache virtual site data file: path: "/var/www/<span>{</span><span>{</span> rootdirectory <span>}</span><span>}</span>" state: absent - name: Remove Apache conffile file: path: "/etc/httpd/conf.d/<span>{</span><span>{</span> rootdirectory <span>}</span><span>}</span>.conf" state: absent - name: Restart httpd systemd: name: httpd.service state: reloaded daemon_reload: yes </code></pre> <p>今回のメイン。削除用のタスクです。</p> <p>やっていることは冒頭で記した通り。</p> <h2 id="動作確認"><a href="#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D">動作確認</a></h2> <h3 id="削除用プレイブックを走らせる前"><a href="#%E5%89%8A%E9%99%A4%E7%94%A8%E3%83%97%E3%83%AC%E3%82%A4%E3%83%96%E3%83%83%E3%82%AF%E3%82%92%E8%B5%B0%E3%82%89%E3%81%9B%E3%82%8B%E5%89%8D">削除用プレイブックを走らせる前</a></h3> <pre><code class="bash"># less /etc/passwd ## 略 USERNAME:x: </code></pre> <p>設定用プレイブックで追加されたユーザがいることを確認。</p> <pre><code class="bash"># less /etc/vsftpd/user_list ## 略 # BEGIN ANSIBLE basic setup: USERNAME USERNAME # END ANSIBLE basic setup: USERNAME </code></pre> <p>ここにも。</p> <pre><code class="bash"># ls -al /etc/vsftpd/user_conf/ 合計 4 drwxrwxr-x 2 ADMIN_USER ADMIN_USER 23 MM月 DD hh:ii . drwxr-xr-x 3 ADMIN_USER ADMIN_USER 150 MM月 DD hh:ii .. -rw-rw-r-- 1 ADMIN_USER ADMIN_USER 107 MM月 DD hh:ii USERNAME # less /etc/vsftpd/user_conf/USERNAME # BEGIN ANSIBLE basic setup: USERNAME local_root=/var/www/sample_site # END ANSIBLE basic setup: USERNAME </code></pre> <p>ここにも。</p> <pre><code class="bash"># ls -al /var/www/ 合計 4 drwxr-xr-x 5 ADMIN_USER ADMIN_USER 51 MM月 DD hh:ii . drwxr-xr-x. 22 ADMIN_USER ADMIN_USER 4096 MM月 DD hh:ii .. drwxr-xr-x 2 ADMIN_USER ADMIN_USER 6 MM月 DD hh:ii cgi-bin drwxr-xr-x 3 ADMIN_USER ADMIN_USER 35 MM月 DD hh:ii html drwxr-xr-x 3 ADMIN_USER ADMIN_USER 17 MM月 DD hh:ii sample_site # ls -al /etc/httpd/conf.d/ 合計 36 drwxr-xr-x 2 ADMIN_USER ADMIN_USER 137 MM月 DD hh:ii . drwxr-xr-x 5 ADMIN_USER ADMIN_USER 92 MM月 DD hh:ii .. -rw-r--r-- 1 ADMIN_USER ADMIN_USER 366 MM月 DD hh:ii README -rw-r--r-- 1 ADMIN_USER ADMIN_USER 2926 MM月 DD hh:ii autoindex.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 1252 MM月 DD hh:ii php.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 9443 MM月 DD hh:ii ssl.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 1252 MM月 DD hh:ii userdir.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 824 MM月 DD hh:ii welcome.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 439 MM月 DD hh:ii sample_site.conf # less /etc/httpd/conf.d/sample_site.conf <VirtualHost 192.0.2.1:80> DocumentRoot "/var/www/sample_site/web" ServerName www.sample_site.jp ServerAlias sample_site.jp ScriptAlias /cgi-bin/ /var/www/sample_site/web/cgi-bin/ RewriteEngine on RewriteCond %{HTTP_HOST} ^sample_site\.jp$ RewriteRule ^(.*)$ http://www.sample_site.jp$1 [R=301,L] <Directory "/var/www/sample_site/web"> allow from all AllowOverride All Options FollowSymLinks Require all granted </Directory> </VirtualHost> </code></pre> <p>Apache 側にも仮想サイトの設定があり、仮想サイト用のディレクトリが切られていることを確認。</p> <p>FTPでログインしたり、 <code>hosts</code> で名前解決して仮想サイトにアクセスできることを確認。</p> <p>一通りプレイブックの設定通りです。</p> <h3 id="削除用プレイブックを走らせる"><a href="#%E5%89%8A%E9%99%A4%E7%94%A8%E3%83%97%E3%83%AC%E3%82%A4%E3%83%96%E3%83%83%E3%82%AF%E3%82%92%E8%B5%B0%E3%82%89%E3%81%9B%E3%82%8B">削除用プレイブックを走らせる</a></h3> <h4 id="Dry run"><a href="#Dry+run">Dry run</a></h4> <pre><code class="bash"># ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/reset.yml -u SSH_REMOTEUSER --private-key=&quot;/root/.ssh/PRIVATE_KEY&quot; -K --check BECOME password: PLAY [Remove vsftpd and httpd settings] *************************************************************************** TASK [Gathering Facts] ********************************************************************************************ok: [192.0.2.1] TASK [Remove user] ************************************************************************************************changed: [192.0.2.1] TASK [Remove user in vsftpd user_list] ****************************************************************************changed: [192.0.2.1] TASK [Remove user_conf file] **************************************************************************************changed: [192.0.2.1] TASK [Restart vsftpd] *********************************************************************************************changed: [192.0.2.1] TASK [Remove Apache virtual site data] ****************************************************************************changed: [192.0.2.1] TASK [Remove Apache conffile] *************************************************************************************changed: [192.0.2.1] TASK [Restart httpd] **********************************************************************************************changed: [192.0.2.1] PLAY RECAP ********************************************************************************************************192.0.2.1 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 </code></pre> <p>まずは Dry run でエラーが出ないことを確認。大丈夫そうです。</p> <h4 id="本番"><a href="#%E6%9C%AC%E7%95%AA">本番</a></h4> <pre><code class="bash"># ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/reset.yml -u SSH_REMOTEUSER --private-key=&quot;/root/.ssh/PRIVATE_KEY&quot; -K BECOME password: PLAY [Remove vsftpd and httpd settings] *************************************************************************** TASK [Gathering Facts] ********************************************************************************************ok: [192.0.2.1] TASK [Remove user] ************************************************************************************************changed: [192.0.2.1] TASK [Remove user in vsftpd user_list] ****************************************************************************changed: [192.0.2.1] TASK [Remove user_conf file] **************************************************************************************changed: [192.0.2.1] TASK [Restart vsftpd] *********************************************************************************************changed: [192.0.2.1] TASK [Remove Apache virtual site data] ****************************************************************************changed: [192.0.2.1] TASK [Remove Apache conffile] *************************************************************************************changed: [192.0.2.1] TASK [Restart httpd] **********************************************************************************************changed: [192.0.2.1] PLAY RECAP ********************************************************************************************************192.0.2.1 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 </code></pre> <p>続いて本番実行。完了しました。</p> <h3 id="削除用プレイブックを走らせた後"><a href="#%E5%89%8A%E9%99%A4%E7%94%A8%E3%83%97%E3%83%AC%E3%82%A4%E3%83%96%E3%83%83%E3%82%AF%E3%82%92%E8%B5%B0%E3%82%89%E3%81%9B%E3%81%9F%E5%BE%8C">削除用プレイブックを走らせた後</a></h3> <p>それでは、念のため確認していきたいと思います。</p> <pre><code class="bash"># less /etc/passwd </code></pre> <p>設定したユーザが消えていることを確認。</p> <pre><code class="bash"># ls -al /etc/vsftpd/user_conf/ 合計 0 drwxrwxr-x 2 ADMIN_USER ADMIN_USER 6 MM月 DD hh:ii . drwxr-xr-x 3 ADMIN_USER ADMIN_USER 150 MM月 DD hh:ii .. # less /etc/vsftpd/user_list ## 略 nobody </code></pre> <p>vsftpd の設定も消えています。OK。</p> <pre><code class="bash"># ls -al /var/www/ 合計 4 drwxr-xr-x 4 ADMIN_USER ADMIN_USER 33 MM月 DD hh:ii . drwxr-xr-x. 22 ADMIN_USER ADMIN_USER 4096 MM月 DD hh:ii .. drwxr-xr-x 2 ADMIN_USER ADMIN_USER 6 MM月 DD hh:ii cgi-bin drwxr-xr-x 3 ADMIN_USER ADMIN_USER 35 MM月 DD hh:ii html # ls -al /etc/httpd/conf.d/ 合計 32 drwxr-xr-x 2 ADMIN_USER ADMIN_USER 114 MM月 DD hh:ii . drwxr-xr-x 5 ADMIN_USER ADMIN_USER 92 MM月 DD hh:ii .. -rw-r--r-- 1 ADMIN_USER ADMIN_USER 366 MM月 DD hh:ii README -rw-r--r-- 1 ADMIN_USER ADMIN_USER 2926 MM月 DD hh:ii autoindex.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 1252 MM月 DD hh:ii php.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 9443 MM月 DD hh:ii ssl.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 1252 MM月 DD hh:ii userdir.conf -rw-r--r-- 1 ADMIN_USER ADMIN_USER 824 MM月 DD hh:ii welcome.conf </code></pre> <p>仮想サイトのディレクトリは丸ごと消えて、設定ファイルも消えました。OKです。</p> <p>当然、FTPでログインできなくなっていますし、ブラウザでアクセスすると仮想サイトが消えたので代理の仮想サイトが応答してきました。OKです。</p> <hr /> <p>以上より、一通り意図通りの動作になったことを確認できました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="Ansible"><a href="#Ansible">Ansible</a></h3> <h4 id="ユーザ削除"><a href="#%E3%83%A6%E3%83%BC%E3%82%B6%E5%89%8A%E9%99%A4">ユーザ削除</a></h4> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/moiwa/items/bab0f4c8d0dbf361afa4">Ansible ~userモジュール~ - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/KeijiYONEDA/items/011b78b12022202d4ea1">【Ansible】開発者ユーザー追加・削除のベスト・プラクティスを考える - Qiita</a></li> </ul> <h4 id="ファイル削除"><a href="#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%89%8A%E9%99%A4">ファイル削除</a></h4> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://tekunabe.hatenablog.jp/entry/2019/03/03/ansible_file_intro#-%E4%BE%8B2-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">[Ansible] file モジュールの基本的な使い方(ファイルやディレクトリの操作) - てくなべ (tekunabe)</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/waterada/items/4e64cc6f810a92001c95">ansible のモジュール(ファイル操作等)をまとめてみました - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.greptips.com/posts/1269/">Ansibleのfileモジュールでディレクトリをabsentするのは危険 - grep Tips *</a></li> </ul> <h4 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h4> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://tech.smartcamp.co.jp/entry/2019/05/10/215035">Ansible Playbookでユーザ管理(登録・削除)をまるっとやる - SMARTCAMP Engineer Blog</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/volanja/items/54a7dbc75b909e89d8fc">Ansibleの新モジュール replace(置換)を使ってみた。 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://uuutee.net/ansible/howto-replacing-text-with-ansible/">Ansibleでテキスト置換を行ういくつかの方法 | uuutee.log</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://akishin.hatenablog.jp/entry/20130817/1376709924">Ansible で複数行の文字列置換 - akishin999の日記</a></li> </ul> <h3 id="Linuxコマンド"><a href="#Linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">Linuxコマンド</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://eng-entrance.com/linux-command-userdel">userdelコマンドについて詳しくまとめました 【Linuxコマンド集】</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16307 2020-12-07T18:40:21+09:00 2020-12-21T17:14:56+09:00 https://crieit.net/posts/Linux-NIC LinuxサーバにNICのドライバをインストールした話 <h1 id="作業背景"><a href="#%E4%BD%9C%E6%A5%AD%E8%83%8C%E6%99%AF">作業背景</a></h1> <p><strong>昔、HPE製のタワー型サーバをキッティングした時の話</strong><br /> - 設計段階でNICがテキトーに選定された為、標準搭載のNICと、追加したNICがそれぞれ別の製造元だった。<br /> <del>誰がそんなテキトーしたのか?自分自身である。</del></p> <ul> <li>標準搭載されていたNICはBroadcom製 追加したNICはIntel製<br /> サーバにはIntel製NICのドライバが入っていなかった。</li> </ul> <h1 id="作業環境"><a href="#%E4%BD%9C%E6%A5%AD%E7%92%B0%E5%A2%83">作業環境</a></h1> <ul> <li>タワー型サーバ ML30Gen10</li> <li>OS       CentOS7.4</li> </ul> <h1 id="作業手順"><a href="#%E4%BD%9C%E6%A5%AD%E6%89%8B%E9%A0%86">作業手順</a></h1> <p><strong>1.NICの製造元とコントローラを確認する</strong><br /> NICの情報を確認する手段はいくつかあるが、複数NICのインターフェース名も確認したかった為、ここではnmcliコマンドを使っている。</p> <pre><code>$ nmcli </code></pre> <p>※作業当時のサーバにはそもそもインストールされていなかった為、確認していなかったが、インターフェースのドライバ情報(ドライバ名、バージョン)等はethtoolコマンドで確認できる。</p> <pre><code>$ ethtool -i <インターフェース名> </code></pre> <p><strong>2.必要なパッケージをインストールする</strong></p> <pre><code>$ sudo yum install -y wget #ドライバのダウンロードに使用 $ sudo yum install -y rpm-build #ダウンロードしたドライバのコンパイルに使用 $ sudo yum install -y kernel-devel #コンパイルする時に必要なヘッダファイル等をインストールする </code></pre> <p>kernel-develをインストールしたら、一度再起動する。</p> <pre><code>$ sudo reboot </code></pre> <p><strong>3.ドライバをダウンロードする</strong></p> <pre><code>$ mkdir /home/user/Downloads #ダウンロード先を用意する $ cd /home/user/Downloads #ダウンロードフォルダに移動 $ wget https://sourceforge.net/projects/e1000/files/igb%20stable/5.3.5.36/igb-5.3.5.36.tar.gz #NICのベースドライバ $ wget https://sourceforge.net/projects/e1000/files/e1000e%20stable/3.5.1/e1000e-3.5.1.tar.gz #当時最新のPCIe用のネットワークアダプタドライバ </code></pre> <p><strong>4.ダウンロードしたドライバをrpmパッケージにコンパイルする</strong></p> <pre><code>$ rpmbuild -tb --clean igb-5.3.5.36.tar.gz $ rpmbuild -tb --clean e1000e-3.5.1.tar.gz </code></pre> <p>rpmbuildは、設定を変更せずにコンパイルを実行すると、デフォルトで$HOME/rpmbuildディレクトリ以下を生成するので移動する。</p> <pre><code>$ cd /home/user/rpmbuild/RPMS/x86_64 </code></pre> <p><strong>5.ドライバをインストールする</strong></p> <pre><code>$ rpm -ivh igb-5.3.5.36.x86_64.rpm </code></pre> <p><strong>6.ネットワークを再起動する</strong></p> <pre><code>$ sudo systemctl restart network </code></pre> <p>ネットワークの再起動後、LANケーブルを挿してNICが認識されることを確認したら終了。</p> Nata tag:crieit.net,2005:PublicArticle/16056 2020-09-14T00:56:54+09:00 2020-09-14T01:01:35+09:00 https://crieit.net/posts/Failed-to-get-D-Bus-connection-Operation-not-permitted-CentOS-7-docker-PostgreSQL 『Failed to get D-Bus connection: Operation not permitted』で、CentOS 7のdockerでPostgreSQLの起動が失敗した件 <p>さきほどの話ですが、PostgreSQLのコマンドを確認したかったので、PostgreSQLをインストールしました。<br /> ちょうどLinuxコマンドの動作確認用に、手元でCent OS 7のDockerを起動していたので、そこにインストールして起動します。</p> <p>イメージとしては、こんな感じです。</p> <pre><code class="sh">$ docker run -it centos:centos7 /bin/bash [root@15eba360665a /]# whoami root [root@15eba360665a /]# yum install postgresql-server ... Installed: postgresql-server.x86_64 0:9.2.24-4.el7_8 ... [root@15eba360665a /]# systemctl start postgresql Failed to get D-Bus connection: Operation not permitted </code></pre> <p><strong>PostgreSQLを起動しようとしたのですが、見事に失敗しました。</strong></p> <h2 id="Failed to get D-Bus connection: Operation not permitted"><a href="#Failed+to+get+D-Bus+connection%3A+Operation+not+permitted">Failed to get D-Bus connection: Operation not permitted</a></h2> <p>エラーメッセージで検索したところ、2つの原因がわかりました。</p> <ul> <li>リソースへのアクセス権限が足りない</li> <li>systemdが起動していない</li> </ul> <h2 id="上記のエラーを解決する方法"><a href="#%E4%B8%8A%E8%A8%98%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95">上記のエラーを解決する方法</a></h2> <p>同じエラーに遭遇した方のページに、解決方法が書いてありました。</p> <pre><code class="sh">$ docker run -d --privileged --name docker_test centos /sbin/init $ docker exec -it docker_test /bin/bash # yum install -y httpd # systemctl start httpd # systemctl status httpd </code></pre> <blockquote> <p><strong>DockerでCentOS7起動時にsystemctlが動かないとき</strong><br /> 普通に適当(雑の方の意味)に起動するだけだと動かないのです。<br /> 対策として下記の3つを使用することで、systemctlが使用できるようになります。</p> <ul> <li>--privilegedを使用する。</li> <li>/sbin/initで起動する。</li> <li>上記に合わせ、-itではなく-dで起動し、起動後にexecする。</li> </ul> <p><a target="_blank" rel="nofollow noopener" href="https://www.tcmobile.jp/dev_blog/devtool/dockerでcentos7起動時のsystemctlが動かないとき/">https://www.tcmobile.jp/dev_blog/devtool/docker%E3%81%A7centos7%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AEsystemctl%E3%81%8C%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D/</a> より</p> </blockquote> <h2 id="-—privilegedを使用する"><a href="#-%E2%80%94privileged%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B">-—privilegedを使用する</a></h2> <p>systemctl実行時のエラーメッセージには、「D-Bus connection: Operation not permitted」と書いてあります。<br /> このことから、権限が足りてないことまではわかります。</p> <p>そこで登場するのが、『--privileged』というコマンドオプションです。<br /> 『privileged』は日本語に訳すと特権という意味で、起動するコンテナに特権を付与します。</p> <blockquote> <p><strong>2.コンテナに特権を与える場合</strong><br /> コンテナからホスト上のファイルへアクセスする際に最も簡単なものがこちらです。<br /> コンテナに特権を付与することで、ホスト上のすべてのデバイスへのアクセスする権限が与えられます。<br /> 以下のようにdocker runのオプションとして「--privileged」と入力すると特権が付与されます。<br /> <a target="_blank" rel="nofollow noopener" href="https://armadillo.atmark-techno.com/blog/10899/4191">https://armadillo.atmark-techno.com/blog/10899/4191</a> より</p> </blockquote> <h3 id="privilegedは危険を伴うオプションである"><a href="#privileged%E3%81%AF%E5%8D%B1%E9%99%BA%E3%82%92%E4%BC%B4%E3%81%86%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E3%81%82%E3%82%8B">privilegedは危険を伴うオプションである</a></h3> <p>『--privileged』を付与することによって、無事にPostgreSQLを起動することに成功しました。<br /> しかしながら、さらに調査を続けたところ、<strong>『--privileged』は危険を伴うオプション</strong>のようです。</p> <blockquote> <p><strong>Dockerコンテナを特権モードで実行することが危険な理由</strong><br /> Docker の「Privileged(特権)」コンテナ(以下、特権コンテナ)は、簡潔に言えば、ホストコンピュータに対するすべてのルート権限を備えたコンテナであり、通常のコンテナではアクセスできないリソースへのアクセスが可能となります。<br /> <a target="_blank" rel="nofollow noopener" href="https://blog.trendmicro.co.jp/archives/23577">https://blog.trendmicro.co.jp/archives/23577</a> より</p> </blockquote> <p>トレンドマイクロ社が専用記事で警告しているくらいですから、鬼気迫るものがあります。<br /> 『--privileged』は、あくまで今回のような一時的な使用に限定し、本番環境で使用しないほうが無難です。</p> <h2 id="/sbin/init経由で、systemdを起動する"><a href="#%2Fsbin%2Finit%E7%B5%8C%E7%94%B1%E3%81%A7%E3%80%81systemd%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B">/sbin/init経由で、systemdを起動する</a></h2> <p>initはLinuxカーネルの起動後、最初に実行されるプロセスです。<br /> Qiitaのinitまとめ(ざっくり)が、簡潔にまとめてありオススメです。</p> <blockquote> <p><strong>initとは</strong></p> <ul> <li>initは他のプロセスを起動させる役割を持っており, 全てのプロセスの親である.</li> <li>Linuxカーネルの起動後, 一番最初に起動される.</li> <li>PIDは1が付与されている.</li> </ul> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/h_tyokinuhata/items/26b7dd3526e7061596b9">https://qiita.com/h_tyokinuhata/items/26b7dd3526e7061596b9</a> より</p> </blockquote> <p>なお、実際にCent OS7で確認したところ、実体はsystemdへのシンボリックリンクになっておりました。</p> <pre><code class="sh">[root@0467571e7b9b ~]# ls -l /sbin/init lrwxrwxrwx 1 root root 22 Aug 9 21:38 /sbin/init -> ../lib/systemd/systemd </code></pre> <h3 id="単純に起動したdockerコンテナは、必要最小限のプロセスしか実行されない"><a href="#%E5%8D%98%E7%B4%94%E3%81%AB%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9Fdocker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AF%E3%80%81%E5%BF%85%E8%A6%81%E6%9C%80%E5%B0%8F%E9%99%90%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%97%E3%81%8B%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84">単純に起動したdockerコンテナは、必要最小限のプロセスしか実行されない</a></h3> <p>『/sbin/init』のプロセスが起動していないことは、実際にプロセスを確認するとわかります。<br /> コンテナ実行時に指定したコマンド以外は、見事に何もプロセスがありません。</p> <pre><code class="sh">$ docker run --rm -it centos:centos7 /bin/bash [root@d0090488dced /]# ps axuw -w USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 5.0 0.1 11840 2876 pts/0 Ss 08:02 0:00 /bin/bash root 14 0.0 0.1 51768 3540 pts/0 R+ 08:02 0:00 ps axuw -w </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>Dockerコンテナは、必要最小限の権限付与とプロセスしか起動しないため、通常のサーバーとは異なる特性があります。<br /> 本記事のようなケースでは、素直に公式のPostgreSQLイメージを使おうと心に誓いました。</p> このすみ tag:crieit.net,2005:PublicArticle/15567 2019-11-30T15:32:41+09:00 2019-11-30T15:32:41+09:00 https://crieit.net/posts/MinQ-2-Docker-CentOS MinQ開発日記 (2) DockerでCentOS環境構築 <h1 id="Dockerで環境構築"><a href="#Docker%E3%81%A7%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89">Dockerで環境構築</a></h1> <p>Docker上に<a target="_blank" rel="nofollow noopener" href="https://knowledge.sakura.ad.jp/serialization/understood-cats-vps/">ネコでもわかる!さくらのVPS講座</a>のCentOSの環境を構築してみます.</p> <p>この際非対話的な環境構築(つまりDockerfile)に関しては以下を参考にしました.</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/Riliumph/items/3b09e0804d7a04dff85b">Dockerで開発環境を仮想化する</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/libra_lt/items/dd98297cb00aaf1c4c67">Docker(CentOS)イメージから新規ユーザを追加し運用できるようにするまで</a></li> </ul> <p>手元の環境を出来るだけVPS側と共通の環境を構築するのが目的です.</p> <h2 id="流れ"><a href="#%E6%B5%81%E3%82%8C">流れ</a></h2> <ul> <li>CentOS7のイメージの取得</li> <li>パッケージの更新</li> <li>作業用ユーザーの設定</li> <li>SSHによる接続</li> <li>rootユーザーによるSSHによるログイン規制</li> </ul> <h2 id="環境構築"><a href="#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89">環境構築</a></h2> <h3 id="CentOS7のイメージの取得"><a href="#CentOS7%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E5%8F%96%E5%BE%97">CentOS7のイメージの取得</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/centos/?tab=tags">CentOSイメージ</a>を取得します. バージョンは7で良いと思います. image_name:tagという形式で指定します.</p> <pre><code class="Dockerfile">FROM centos:7 </code></pre> <h3 id="パッケージの更新"><a href="#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B4%E6%96%B0">パッケージの更新</a></h3> <p>イメージを作成した時点でパッケージの状態は止まっています. 更新しておきましょう.</p> <pre><code class="Dockerfile">RUN yum -y update </code></pre> <h3 id="作業用ユーザーの設定"><a href="#%E4%BD%9C%E6%A5%AD%E7%94%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A">作業用ユーザーの設定</a></h3> <p>普通この作業は以下のコマンドを使い対話的に行います.</p> <ul> <li>adduser</li> <li>passwd</li> </ul> <p>しかしDockerfileではこれらは使えません. 代わりに以下を使うようです.</p> <ul> <li>useradd</li> <li>chpasswd</li> </ul> <p>一般にパスワードもハードコードはご法度です🔑 このコンテナをデプロイするわけではないので正直ハードコードしても同じなのですが環境変数の設定もしておきましょう. docker inspectのCmdセクションを見ると一目瞭然だからです. あくまでローカルで動かす利便性のための処置です.</p> <p>また現状のCentOSには何も入っていないので必要なパッケージも追加しておきましょう.</p> <pre><code class="dockerfile">ENV USER_NAME vpsuser ENV HOME /home/${USER_NAME} RUN yum -y update && yum -y install \ useradd \ chpasswd RUN useradd --create-home ${USER_NAME} && \ echo "${USER_NAME}:tekitou" | chpasswd </code></pre> <p>このDockerfileからイメージを作成します.</p> <pre><code class="bash">docker build -t your_image:0.1 . </code></pre> <p>名前は自由に決めましょう. これでhome以下にvpsuserが追加されました.</p> <h3 id="一般ユーザーでのログイン"><a href="#%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A7%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3">一般ユーザーでのログイン</a></h3> <p>これは万が一ルート権限を奪われても被害を最小限にするための重要な設定らしいです. Dockerでは必要ない気もしますが, なんとなくルートでシステムを触るのも憚られるので設定をしておきます. Dockerの場合ログインというより一般ユーザーとしてコンテナを実行するということになると思います.</p> <p>その前にこの時点でどのような状態なのかを調べておきます.</p> <pre><code class="bash">docker run -it --rm your_image:0.1 whoami </code></pre> <p>でrootと出ればルート・アカウントでログインしていることになります.</p> <p>USER命令を使うとユーザーが指定できます.</p> <blockquote> <p>The USER instruction sets the user name (or UID) and optionally the user group (or GID) to use when running the image and for any RUN, CMD and ENTRYPOINT instructions that follow it in the Dockerfile.</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/engine/reference/builder/#USER">Dockerfile reference</a></p> <p>また作業ディレクトリも変更しておきます.</p> <blockquote> <p>the WORKDIR instruction sets the working directory for any RUN, CMD, ENTRYPOINT, COPY and ADD instructions that follow it in the Dockerfile.</p> </blockquote> <pre><code class="dockerfile">USER ${USER_NAME} WORKDIR ${HOME} </code></pre> <p>この状態で再びコンテナを対話モードで起動して</p> <pre><code class="bash">yum -y update </code></pre> <p>を実行するとPermission deniedというエラーが出るはずです. sudoコマンドを使ってみましょう.</p> <pre><code class="bash">vpsuser is not in the sudoers file. This incident will be reported. </code></pre> <p>sudoersファイルにvpsuserはいないよと怒られてしまいました. sudoerというのはグループでここにvpsuserが登録されていると指定されたコマンドが実行できるようになります. /etc/sudoersというファイルで設定されています. 変更方法はいくつかあります.</p> <ul> <li>visudo</li> <li>usermod</li> <li>gpasswd</li> </ul> <p>visudoは/etc/sudoersを直接編集するので面倒です. usermodとgpasswdは同じようなことができるようです.</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tk1024/items/16e98031b84a31df469b">usermodでグループを追加するのは危険</a></p> <p>コマンドよりもどのグループを指定するかの方が問題です. 現状を確認しておきましょう.</p> <pre><code class="bash">groups vpsuser </code></pre> <p>とするとvpsuserはvpsuserというグループに所属しています(プライマリ・グループと呼ぶようです). 確かに/etc/groupの末尾にvpsuserというのが存在します. CentOSではwheelグループに登録するといいようです(これをセカンダリ・グループと呼ぶようです).</p> <pre><code class="bash">usermod -aG wheel ${USER_NAME} </code></pre> <p>こうするとvpsuserはsudoerとしてsudoでルート権限で実行が許されたコマンドも実行できるようになります.</p> <p><a target="_blank" rel="nofollow noopener" href="http://codaholic.org/?p=1757">[Linux] なぜ sudo する権限のあるグループが「 wheel 」という名前なのか</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.atmarkit.co.jp/ait/articles/1706/02/news014.html">Linuxのユーザーとグループって何だろう?</a></p> <h3 id="SSHによる接続"><a href="#SSH%E3%81%AB%E3%82%88%E3%82%8B%E6%8E%A5%E7%B6%9A">SSHによる接続</a></h3> <p>SSHによる接続はインターネット経由でサーバーにアクセスする場合に通信の内容を傍受されないように暗号化するためです. ので無視します.</p> <h3 id="Webサーバー"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC">Webサーバー</a></h3> <p>Apacheはwebサーバーですが, Goの場合いらないようです. 正確には要らないというよりは<a target="_blank" rel="nofollow noopener" href="https://golang.org/pkg/net/http/">net/httpパッケージ</a>としてwebサーバーに必要な機能が提供されています.</p> <blockquote> <p>Package http provides HTTP client and server implementations.</p> </blockquote> <p>がこの辺はPHPより取り扱いが楽な予感がします. PHPの<a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/en/features.commandline.webserver.php">Built-in web server</a>には以下のような警告文が掲載されています.</p> <blockquote> <p>Warning<br /> This web server was designed to aid application development. It may also be useful for testing purposes or for application demonstrations that are run in controlled environments. It is not intended to be a full-featured web server. It should not be used on a public network.</p> </blockquote> <p>つまり開発用サーバーということでネットに公開するならApacheやnginxなどのwebサーバーが必要になります. ただしGoでもApacheとかnginxとかと使う例とかもあるのであったほうがいいケースとかもあるのかなとは思います.</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/unokun/items/dcf3ed4fbc4f532f664a">nginx + golangでWeb API開発</a><br /> <a target="_blank" rel="nofollow noopener" href="https://echo.labstack.com/cookbook/load-balancing">Load Balancing Recipe</a><br /> <a target="_blank" rel="nofollow noopener" href="https://echo.labstack.com/cookbook/reverse-proxy">Reverse Proxy Recipe</a><br /> <a target="_blank" rel="nofollow noopener" href="https://medium.com/web-developer/golangーzero-downtime-deploys-and-rollbacks-go-http-serverーecho-web-framework-apache-12a9a21bfc25">GoLang: Zero downtime deploys and Rollbacks | Go HTTP server−Echo Web Framework & Apache</a></p> <h3 id="アプリケーション・サーバー(APサーバー)"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%28AP%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%29">アプリケーション・サーバー(APサーバー)</a></h3> <p>APサーバーも不要なようです. 3層アーキテクチャを前提にすると, APサーバーはWebサーバーから転送されてくるデータを基にDBサーバーと連帯してデータの取得・加工を行うプログラムというのが私の理解です.</p> <p>しかしその存在意義はよく分かりませんでした.</p> <p><a target="_blank" rel="nofollow noopener" href="https://wyukawa.hatenablog.com/entry/20131125/1385367711">Web APサーバーとWebフレームワークをつなぐもの</a>によるとWebサーバーとWebフレームワークの差異を吸収するために存在するようです.</p> <blockquote> <p>Apache以外にもlighttpd, nginxなどさまざまなWebサーバがあるわけだが、そうした多様なWebサーバ環境ごとの差異を吸収するためのコードをWebフレームワーク(例:Catalyst, Django, Rails)が書くのは大変である。ましてWebフレームワークは沢山あるわけだし。そうした状況を解決するために出てきたのがPythonならWSGIであり、RubyならRackであり、PerlならPSGIである。</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/feature/01/wsgi/0001">WSGIとPythonでスマートなWebアプリケーション開発を</a>でも似たようなことが書かれています.</p> <blockquote> <p>Pythonには,Zope,Twisted,Django,TurboGearsなどのさまざまなWebアプリケーションフレームワークが存在します。以前は,このような幅広い選択肢は,新しくPythonを使用しようとするユーザにとって都合が悪いことがありました。使用するフレームワークによって,利用可能なサーバが制限されてしまったり,逆にサーバによって利用可能なWebアプリケーションフレームワークが制限されるといったことがあったためです。そのようなPythonの状況とは対照的に,Javaにおいては,多数のWebアプリケーションフレームワークがあるにもかかわらず,サーバとWebアプリケーションをつなぐ際に,統一されたJava Servelet APIを用いることで,アプリケーションフレームワークを気にせずにServelet APIが利用できる環境で動作させることが可能です。このような,サーバとWebアプリケーションをつなぐ共通のインターフェースをPythonで定義したものが,PEP333(日本語訳版)のWSGI(Web Server Gateway Interface)です。</p> </blockquote> <p>つまりWebフレームワークで作ったWebサービスを起動するサーバー(常駐プロセス?)で, APサーバーのおかげでWebサーバーとWebフレームワークの組み合わせを柔軟に選択できるようです. Goの場合Webサーバーの機能がパッケージとして提供されているのでAPサーバーのようなミドルウェアで切り離す必要がない, と勝手に考えて不要としておきます.</p> <h2 id="まとめと課題"><a href="#%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A8%E8%AA%B2%E9%A1%8C">まとめと課題</a></h2> <p>スケールだ負荷分散だと言い出すと色々と複雑になるのかもしれませんが, シンプルにAPIサーバーを運用するならミドルウェアを省略できたりGoの標準機能でカバーできたりとシンプルに書けて良さそうです. ネコでもわかる!さくらのVPS講座ではこの後Apacheを入れてファイアウォールの設定をして簡単な静的ファイルを配信して確認します. そしてPHPやDBサーバー(MariaDB)を導入しますが, Goの場合はGo言語を入れないとnet/httpが使えないので, まずGoを入れることにします.</p> <h3 id="DB"><a href="#DB">DB</a></h3> <p>後はGoでAPIサーバーということになると必要なのはDBサーバーということになりますがとりあえず置いておきましょう.</p> <h3 id="ファイアーウォールの設定"><a href="#%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%83%BC%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A">ファイアーウォールの設定</a></h3> <p>これはDockerfileからは設定できないようです. つまり起動したコンテナから設定する必要があると思いますが, httpd(Apache)が動いている前提なので, 先にGoでWebアプリケーションを作ってからにしようと思います.</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/i35_267/items/10789865dd240e075eba">Docker : firewalldでssh, http, httpsのみ許可する。(CentOS 7)</a></p> <h2 id="Reference"><a href="#Reference">Reference</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://knowledge.sakura.ad.jp/serialization/understood-cats-vps/">ネコでもわかる!さくらのVPS講座</a><br /> <a target="_blank" rel="nofollow noopener" href="https://vps-news.sakura.ad.jp/tutorials/centos7-initial-settings/?_gl=1*1w3olts*_gcl_aw*R0NMLjE1NzQ1OTM5NTcuQ2p3S0NBaUE4ZWp1QlJBYUVpd0FuLWlKM2xUa0tLOUZOUDJSNWRrS0R5SFRBdTZ0RVhuNnJjN1VUUlpvcDZvQXR1SFNFS2hEc0xKRjNob0NWbU1RQXZEX0J3RQ..&_ga=2.81152852.218098909.1574770419-1929858640.1570088790&_gac=1.12806469.1574593957.CjwKCAiA8ejuBRAaEiwAn-iJ3lTkKK9FNP2R5dkKDyHTAu6tEXn6rc7UTRZop6oAtuHSEKhDsLJF3hoCVmMQAvD_BwE">チュートリアル:CentOS 7(さくらのVPS)サーバ作成直後に設定しておくべき初期セキュリティ設定</a><br /> <a target="_blank" rel="nofollow noopener" href="https://support.conoha.jp/vps/guide/manga/?btn_id=v-study-01-breadcrumbs_guide-manga">マンガで学ぶConoHa</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/Riliumph/items/3b09e0804d7a04dff85b">Dockerで開発環境を仮想化する</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.mtioutput.com/entry/2018/09/20/135157">【UNIX】passwdとchpasswdの違い</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/kimullaa/items/f556431b8103e686f356">DockerのscratchイメージでHello Worldする</a></p> <h3 id="その他"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96">その他</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/kkeisuke/items/7cd4d5834386666faab3">Docker + Go + Gin の開発環境を準備する</a><br /> <a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/develop/dev-best-practices/">Docker development best practices</a><br /> <a target="_blank" rel="nofollow noopener" href="https://japan.zdnet.com/article/35125490/">APIセキュリティ入門</a><br /> <a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Learn/JavaScript/Client-side_web_APIs/Introduction">Web API の紹介</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.atmarkit.co.jp/ait/series/2628/">CentOS 7で始める最新Linux管理入門</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.atmarkit.co.jp/ait/series/4683/">基礎から理解するLinuxサーバー[Cent OS 7.0編]</a><br /> <a target="_blank" rel="nofollow noopener" href="https://linuxize.com/">linuxize</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.atmarkit.co.jp/ait/series/3016/">“応用力”をつけるためのLinux再入門</a></p> <h2 id="Appendix"><a href="#Appendix">Appendix</a></h2> <h3 id="イメージのサイズの軽量化"><a href="#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E8%BB%BD%E9%87%8F%E5%8C%96">イメージのサイズの軽量化</a></h3> <p>実際に(貧乏)VPS上で走らせるにはalpineとかMulti-stage buildsといった節約が必要になります.</p> <p><a target="_blank" rel="nofollow noopener" href="https://medium.com/@chemidy/create-the-smallest-and-secured-golang-docker-image-based-on-scratch-4752223b7324">Create the smallest and secured golang docker image based on scratch</a><br /> <a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/develop/develop-images/multistage-build/">Use multi-stage builds</a></p> <h3 id="RUN vs CMD"><a href="#RUN+vs+CMD">RUN vs CMD</a></h3> <p>RUNで指定したコマンドは実行された結果がレイヤーとしてイメージに取り込まれるが, CMDはコンテナ内で実行されるコマンドを指定する.</p> <h3 id="Dockerにおける機密情報の扱い"><a href="#Docker%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%A9%9F%E5%AF%86%E6%83%85%E5%A0%B1%E3%81%AE%E6%89%B1%E3%81%84">Dockerにおける機密情報の扱い</a></h3> <p>今回はローカルでの開発環境を構築したいだけなので特にセキュリティ面を考慮する必要性はないのですが, ある程度やり方を押さえておくのはいいかと思います.</p> <p>buildサブコマンドの--build-argオプションにはビルド時の引数を渡せる. DockerfileではARGに指定する. <a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/engine/reference/builder/">Dockerfile reference</a>によると機密情報なんかはコマンドで見えてしまうので, Dockerfileに含めるのは良くないようです.</p> <blockquote> <p>Warning: It is not recommended to use build-time variables for passing secrets like github keys, user credentials etc. Build-time variable values are visible to any user of the image with the docker history command.</p> </blockquote> <p>要するにイメージに埋め込まれちゃうのでやめとけと言うことです. hisotryサブコマンドで見えてしまうのと, コンテナの再利用が難しくなってしまいます.</p> <p>公式に用意されている機能としては, Docker secretesと言う機能があるようです(Swarmモードでしか使えないらしいですが).</p> <p><a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/engine/swarm/secrets/">Manage sensitive data with Docker secrets</a></p> <p>もう一つの環境変数を使う方法です. こちらもDockerfileに書いてしまうとinspectサブコマンドでみれてしまうようです.</p> <h4 id="squash option"><a href="#squash+option">squash option</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/a/42125241/12036118">Using SSH keys inside docker container</a></p> ブレイン tag:crieit.net,2005:PublicArticle/15523 2019-11-01T02:12:38+09:00 2019-11-01T20:22:07+09:00 https://crieit.net/posts/AWX-Server-Error AWX をインストールした後の Server Error を解決したかった話 <p>この記事は、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx">Ansible AWX</a> をインストールしたときに、 Server Error に <strong>なったりならなかったりする</strong> 問題に対処したときのポエムだ。</p> <p><a href="https://crieit.now.sh/upload_images/e835b521a9d07ba5a1f19762bb3928fe5dbb159674c75.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e835b521a9d07ba5a1f19762bb3928fe5dbb159674c75.png?mw=700" alt="1921_ansible_awx_error_00.png" /></a></p> <p>はじめに断っておくが、最終的に AWX 8.0.0 で解消しているっぽいものの、 原因や正確な条件などは不明なままである。<br /> また後述するが、 (タイトルに反して)おそらく Ansible AWX の問題ではなく、 postgres:9.6 の docker イメージの問題ではないかと思われる。</p> <h2 id="発生した問題の状況"><a href="#%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E5%95%8F%E9%A1%8C%E3%81%AE%E7%8A%B6%E6%B3%81">発生した問題の状況</a></h2> <p>まず、 問題が起きている状況をまとめると、以下のような状況だ。</p> <ul> <li>AWX を <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/7.0.0/INSTALL.md#docker-compose">Docker-Compose</a> を使ってインストール</li> <li>AWX のバージョンは、 7.0.0 または 6.1.0 (どちらでも発生する)</li> <li>インストール先は CentOS 7.7 1908 の VirtualBox のゲストマシン</li> <li>どういうわけか、 <strong>問題が起きる場合と起きない場合がある</strong> <ul> <li>仮想ストレージが (SSD ではなく) HDD 上にあると発生しやすい気がする</li> <li>VM のホストが、 バックエンドで I/O をガリガリやっていると発生しやすい気がする</li> <li>VM のホストが、 (バッテリー駆動などで)で省電力モードになっていると発生しやすい気がする</li> </ul></li> <li>問題が発生するかどうかは、インストール後の最初の起動で決まる。 <ul> <li>最初の起動で問題が発生すれば、その後も発生し続ける。</li> <li>逆に、最初の起動で問題が発生しなければ、その後は発生しない。</li> </ul></li> </ul> <p>最後の2つが非常に厄介で、全て VirtualBox で同じリソースを割り当てた VM のゲストマシンに、 同じ設定で CentOS をインストールしているのにもかからず、問題が発生したりしなかったりする。<br /> 訳がわからない。</p> <p>VM のホストをいろいろ買えつつ試してみたところ、上記のような状態の時に問題が派生しやすい気がするが、ハッキリ「そうだ」と言えるほどの回数は試せていない。</p> <p>最初、 良くある SELinux 関係の問題かと思って SELinux を切って AWX のインストールをやり直してみたが、何も変わらなかった。</p> <h2 id="AWX エラーの内容"><a href="#AWX+%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E5%86%85%E5%AE%B9">AWX エラーの内容</a></h2> <p>上記スクショの "Server Error" "A server error has occurred" のメッセージだけでは、どんな問題が発生しているのか全くわからないので、とりあえず各コンテナのログをみてみる。</p> <p>どうやら、 awx_postgres コンテナで、以下のようなエラーが発生しているようだ。</p> <pre><code>FATAL: no pg_hba.conf entry for host "172.18.0.2", user "awx", database "awx", SSL off </code></pre> <p>問題が起きていない環境と、起きている環境で pg_hba.conf (※) を比べると、<br /> 問題が起きていない環境では、このファイルの末尾に</p> <pre><code>host all all all md5 </code></pre> <p>が追記されているという違いがある。</p> <p>(※: pg_hba.conf は awx_postgres コンテナの <code>/var/lib/postgresql/data/pgdata/pg_hba.conf</code> にあるほか、 docker ホスト側でも <code>/tmp/pgdocker/pgdata/pg_hba.conf</code> として永続化されている。 (postgres_data_dir 変数が初期値の場合。))</p> <p>この行がないため、 WEB サービスを走らせているコンテナから PostgreSQL を動かしているコンテナへのアクセスが拒否されているようだ。</p> <p>しかし、問題となっている環境で pg_hba.conf を書き換えても、別のエラーが発生して Server Error が表示される問題は解決しない。</p> <p>問題が起きる環境と起きない環境を更に詳しく比べると、 PostgreSQL の DB が作成すらされていないことがわかった。<br /> 本来なら、 awx_postgres コンテナ内に awx ユーザで DB が作成されている筈なのにもかかわらず、以下のように コンテナに入って psql の --list オプションを実行すると、エラーになってしまう。</p> <pre><code class="bash">$ sudo docker exec -it awx_postgres /bin/bash root@xxxxxxxxxxxx:/# psql --list -U awx psql: FATAL: database "postgres" does not exist </code></pre> <p>以上のことから、 pg_hba.conf の書き換えや、 PostgreSQL DB の初期化といった、 初期化プロセスが実行されずに「初期化済み」扱いされているのが原因ではないかと、予想がつく。</p> <p>awx リポジトリ内で同様の不具合が挙がっていないか確認してみたが、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/issues/4736">似たような問題は挙がっている</a> ものの、それそのものズバリの回答は見つからなかった。</p> <h2 id="pg_hba.conf を書き換えているのは誰だ"><a href="#pg_hba.conf+%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%E8%AA%B0%E3%81%A0">pg_hba.conf を書き換えているのは誰だ</a></h2> <p>audit などを使って pg_hba.conf に関するシステムコールを監視して、 何が host all all all md5 と追記しているのかを確認してみる。</p> <p>その結果、書き換えを行っているのは</p> <pre><code class="bash">bash /usr/local/bin/docker-entrypoint.sh postgres </code></pre> <p>のプロセスだとわかった。</p> <p>AWX 7.0.0 インストール時の <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/7.0.0/installer/roles/local_docker/templates/docker-compose.yml.j2#L131">docker-compose.yml</a> も、 AWX 6.1.0 インストール時の <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/7.0.0/installer/roles/local_docker/templates/docker-compose.yml.j2#L131">docker-compose.yml</a> も、 postgres:9.6 の docker イメージを使っていることがわかる。<br /> このため、 上記の pg_hba.conf の書き換えを行っている docker-entrypoint.sh は、 postgres:9.6 イメージの Dockerfile のエントリーポイントである <a target="_blank" rel="nofollow noopener" href="https://github.com/docker-library/postgres/blob/3610f1e45365fb09c0fea29fa387b35f0efdb3a1/9.6/docker-entrypoint.sh#L119-L122">この docker-entrypoint.sh</a> だろう。</p> <p>前後の PostgreSQL の初期化プロセスも働いていないことを考えると、</p> <pre><code class="bash"> # look specifically for PG_VERSION, as it is expected in the DB dir if [ ! -s "$PGDATA/PG_VERSION" ]; then # "initdb" is particular about the current user existing in "/etc/passwd", so we use "nss_wrapper" to fake that if necessary # see https://github.com/docker-library/postgres/pull/253, https://github.com/docker-library/postgres/issues/359, https://cwrap.org/nss_wrapper.html </code></pre> <p>この条件分岐の部分が、意図通り働かないことがあるのではないかと思う。</p> <p>しかし、私は docker に関してはほとんどシロウトなので、ここから docker イメージの定義ファイルを辿って、どこがおかしいのかを調査するのはちょっと難しい。。。</p> <h2 id="AWX 8.0.0 がリリースされたら解決してた"><a href="#AWX+8.0.0+%E3%81%8C%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%95%E3%82%8C%E3%81%9F%E3%82%89%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%A6%E3%81%9F">AWX 8.0.0 がリリースされたら解決してた</a></h2> <p>…とかなんとかやってるうちに、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/releases/tag/8.0.0">AWX 8.0.0 がリリース</a> されてしまった。</p> <p>8.0.0 で AWX のインストールを試してみると、ぱったりと問題が発生しなくなった。</p> <p>awx_postgres コンテナを作成する docker イメージが、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/8.0.0/installer/roles/local_docker/templates/docker-compose.yml.j2#L131">postgres:9.6 から postgres:10 に変更</a> になったからではないかと考えているが、具体的にどう変わったかは正直わからない。</p> <p>ひょんなことから、原因は不明ながら問題が解決してしまったので、これ以上調査する気力も失せて、私は考えるのをやめた。</p> <p><strong>追記:</strong> そして、記事を書いた直後に <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/releases/tag/9.0.0">AWX 9.0.0 がリリース</a> された。ちょっとペース早すぎない!?</p> advanceboy tag:crieit.net,2005:PublicArticle/15515 2019-10-29T17:42:48+09:00 2019-10-29T17:45:13+09:00 https://crieit.net/posts/systemd-timer systemd/timerを使ってサーバを毎晩リブートさせる <p>サーバを定期的に再起動したいという需要は常に存在します。</p> <p>どっかの誰かが開放し忘れたコードにより徐々に減っていく空きメモリ。原因を追求するより、定期的に再起動しちゃえば一発解決だよね🧙</p> <p>なんか時々落ちるこのサービス、いっそ定期的にサーバを再起動しておけば、たとえ落ちたとしても復活するから、大体の時間は動いてるサービスにできるんじゃないの?😈</p> <p>いいことか悪いことか、かっこいいかどうかはともかくとして、定期的にサーバを再起動しておけば解決できるある種の問題が存在することは事実です。問題の先送りだって一つの技術力ですし(後ろめたいときって前置きが長くなるよね)</p> <p>ともかくそういうわけで何らかの理由でサーバを定期的に再起動させたいときの設定です。</p> <p>CentOS7から標準になったSystemdのTimer機能を使います</p> <h1 id="serviceの作成と登録"><a href="#service%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E7%99%BB%E9%8C%B2">serviceの作成と登録</a></h1> <pre><code class="shell-session">$ sudo nano /etc/systemd/system/reboot.service </code></pre> <pre><code class="config">[Unit] Description=Scheduled Reboot [Service] Type=simple ExecStart=/usr/bin/systemctl --force reboot </code></pre> <p>こうやって出来たserviceファイルを</p> <pre><code class="console">sudo systemctl enable reboot </code></pre> <p>で登録します。</p> <p>この段階で、</p> <pre><code class="console">sudo systemctl start reboot </code></pre> <p>ってたたいてあげると、サーバが予告なく再起動するかと思います。</p> <p>Q: rebootコマンドじゃないの?<br /> A: rebootとかhaltはCentOS7から非推奨になりました<br /> <a target="_blank" rel="nofollow noopener" href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-power">10.4. システムのシャットダウン、サスペンド、休止状態 Red Hat Enterprise Linux 7 | Red Hat Customer Portal</a></p> <h1 id="Timerの作成と登録"><a href="#Timer%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E7%99%BB%E9%8C%B2">Timerの作成と登録</a></h1> <h1 id="serviceの作成と登録"><a href="#service%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E7%99%BB%E9%8C%B2">serviceの作成と登録</a></h1> <pre><code class="shell-session">$ sudo nano /etc/systemd/system/reboot.timer </code></pre> <pre><code class="config">[Unit] Description=schedule reboot [Timer] Unit=reboot.service OnCalendar=*-*-* 5:30:00 [Install] WantedBy=timers.target </code></pre> <p>この例では毎朝5:30に再起動する記述になっています</p> <pre><code class="console">sudo systemctl enable reboot.timer sudo systemctl start reboot.timer </code></pre> <p>で登録します。</p> <pre><code class="console">$ sudo systemctl list-timers --all NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2019-10-29 17:04:33 JST 4min 59s left n/a n/a systemd-tmpfiles-clean.timer systemd-t Wed 2019-10-30 05:30:00 JST 12h left n/a n/a reboot.timer reboot.se n/a n/a n/a n/a systemd-readahead-done.timer systemd-r </code></pre> <p>という具合に、次の5:30にrebootが予定されていれば出来上がりです。よい再起動ライフを!</p> daisuke furukawa tag:crieit.net,2005:PublicArticle/15499 2019-10-23T03:02:29+09:00 2019-11-22T00:50:37+09:00 https://crieit.net/posts/Ansible-AWX-Playbook プロキシ環境下で Ansible AWX をインストールする Playbook を作る <p>構成管理ツール (いわゆる Infrastructure as Code(IaC)) の中でも比較的易しいと言われる Ansible。<br /> その Ansible の運用を省力化してくれるツールとして <a target="_blank" rel="nofollow noopener" href="https://www.redhat.com/ja/technologies/management/ansible">Ansible Tower</a> というものがあり、そのコミュニティ管理版 (OSS版) が <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx">AWX</a> だ。</p> <p>その AWX がインストールされたサーバを作成する Playbook を作ろうとしたら意外と手間取ったので、そのメモ。</p> <p>なお、インストール先は CentOS 7 である。<br /> AWX のインストールは、 公式ビルド済み docker イメージを <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/8.0.0/INSTALL.md#docker-compose">Docker Compose を使ってコンテナ化する方法</a> を使った。</p> <p><strong>11/21: 追記</strong></p> <p><a target="_blank" rel="nofollow noopener" href="https://pypi.org/project/docker-compose/1.25.0/">docker-compose の PyPI (pip) パッケージが 1.25.0 に更新</a>後、 CentOS 7 (正確には、 Python 2 系を使っている環境) で docker-compose のインストールや実行がうまくいかなくなった。<br /> (<a target="_blank" rel="nofollow noopener" href="https://github.com/docker/compose/commit/719a1b05818cc0dcb4515dc3a704e468061b2455">commit:719a1b0</a> で) subprocess32 に依存するようになり、 gcc 等のビルド環境のインストールが別途必要になったためだ。</p> <p>それに加え、たとえ gcc をインストールしても、依存パッケージの python2 対応が不十分なようで、 docker-compose 実行時にエラーになってしまう。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/docker/compose/issues/7030">docker/compose#7030</a> の Issue には挙がっているが、修正されるかどうか不明なため、一つ前の 1.24.1 を使うことで回避するように、コードを修正した。</p> <p>python2 ツラい。。。<br /> しかし、 2020年にサポート切れになった後も、 CentOS 7 が生きているしばらくの間はこの辛みと付き合わなければならないようだ。<br /> ツラい。。。</p> <p><strong>追記ここまで</strong></p> <h2 id="最終的な Playbook"><a href="#%E6%9C%80%E7%B5%82%E7%9A%84%E3%81%AA+Playbook">最終的な Playbook</a></h2> <p>まず、最終的に作成した playbook を掲載する。</p> <p><a target="_blank" rel="nofollow noopener" href="https://gist.github.com/advanceboy/7fa56d574c40479a654563e8accde10e">AWX を docker-compose と 公式ビルド済みコンテナ を使ってインストールする Ansible Playbook</a></p> <pre><code class="yaml">--- - hosts: all vars: venv_dir: /tmp/venv-awx awx_repo: https://github.com/ansible/awx.git awx_repo_dir: /tmp/awx awx_version: 9.0.1 postgres_data_dir: /tmp/pgdocker #http_proxy: http://proxy.example.com #https_proxy: http://proxy.example.com #no_proxy: localhost,127.0.0.1,company.example.com envs: http_proxy: "<span>{</span><span>{</span> http_proxy | default(ansible_env.http_proxy | default('')) <span>}</span><span>}</span>" https_proxy: "<span>{</span><span>{</span> https_proxy | default(ansible_env.https_proxy | default('')) <span>}</span><span>}</span>" no_proxy: "<span>{</span><span>{</span> no_proxy | default(ansible_env.no_proxy | default('localhost,127.0.0.1')) <span>}</span><span>}</span>" tasks: - environment: "<span>{</span><span>{</span>envs<span>}</span><span>}</span>" block: - name: update pre-setting packages become: yes yum: name: - epel-release - yum-utils state: latest - name: add docker-ce repo become: yes shell: "yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo" args: chdir: /etc/yum.repos.d creates: docker-ce.repo - name: remove conflict packages become: yes yum: name: # https://docs.docker.com/install/linux/docker-ce/centos/#uninstall-old-versions - docker - docker-engine - docker-compose state: absent - name: ensure packages become: yes yum: name: - git - python-pip - python-virtualenv - docker-ce state: latest register: result_pagkages # to abort "Cannot uninstall 'requests'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall." error # using virtualenv to avoid the conflict of python packages between yum and pip when installing docker-compose # -> https://github.com/docker/compose/issues/5883 # # to abort "Unable to load docker-compose. Try `pip install docker-compose`." error # https://www.uramiraikan.net/Works/entry-3362.html # # create virtualenv with --system-site-packages option # to make use of any libraries installed in the system’s Python # https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#running-in-a-virtualenv # # to avoid docker/compose#7030 issue, fix docker-compose package version to 1.24.1 # https://github.com/docker/compose/issues/7030 - name: ensure pip packages pip: name: - ansible - docker-compose==1.24.1 state: present virtualenv: "<span>{</span><span>{</span> venv_dir <span>}</span><span>}</span>" virtualenv_site_packages: yes - block: - name: create docker proxy settings directory become: yes file: path: /etc/systemd/system/docker.service.d state: directory owner: root group: root mode: u=rwx,g=rx,o=rx - name: create docker proxy settings become: yes copy: dest: /etc/systemd/system/docker.service.d/http-proxy.conf content: | [Service] Environment="HTTP_PROXY=<span>{</span><span>{</span> envs.http_proxy <span>}</span><span>}</span>" "HTTPS_PROXY=<span>{</span><span>{</span> envs.https_proxy <span>}</span><span>}</span>" "NO_PROXY=<span>{</span><span>{</span> envs.no_proxy <span>}</span><span>}</span>" register: result_proxy when: envs.http_proxy or envs.https_proxy - block: - name: get the current groups command: groups changed_when: false register: original_groups - name: ensure the connecting user is member of docker group become: yes user: name: "<span>{</span><span>{</span> ansible_env.USER <span>}</span><span>}</span>" groups: docker append: yes register: result_user # reset ssh connection for refletction the changed groups # (`meta: reset_connection` occurs an error on current ansible version) # https://stackoverflow.com/a/28213378 - name: kill open ssh sessions for force reconnection shell: sleep 1; pkill -u <span>{</span><span>{</span> ansible_env.USER <span>}</span><span>}</span> sshd async: 3 poll: 2 when: result_user is changed when: ansible_env.USER != 'root' - name: enable and restart docker service become: yes systemd: name: docker state: restarted enabled: yes daemon_reload: yes when: result_pagkages is changed or result_user is changed or result_proxy is changed - name: git clone awx git: repo: '<span>{</span><span>{</span>awx_repo<span>}</span><span>}</span>' dest: '<span>{</span><span>{</span>awx_repo_dir<span>}</span><span>}</span>' version: '<span>{</span><span>{</span>awx_version<span>}</span><span>}</span>' clone: yes force: yes - name: record playbook options set_fact: install_awx_playbook_opotions: >- -e postgres_data_dir=<span>{</span><span>{</span> postgres_data_dir <span>}</span><span>}</span> {% if envs.http_proxy or envs.https_proxy %} -e http_proxy=<span>{</span><span>{</span> envs.http_proxy <span>}</span><span>}</span> -e https_proxy=<span>{</span><span>{</span> envs.https_proxy <span>}</span><span>}</span> -e no_proxy=<span>{</span><span>{</span> envs.no_proxy <span>}</span><span>}</span> {% endif %} - name: execute awx playbook shell: "source <span>{</span><span>{</span> venv_dir+'/bin/activate' | quote <span>}</span><span>}</span>; ansible-playbook -i inventory install.yml <span>{</span><span>{</span> install_awx_playbook_opotions <span>}</span><span>}</span>" args: chdir: '<span>{</span><span>{</span>awx_repo_dir<span>}</span><span>}</span>/installer' tags: - inner-playbook - name: ensure the connecting user is not member of docker group become: yes user: name: "<span>{</span><span>{</span> ansible_env.USER <span>}</span><span>}</span>" groups: "<span>{</span><span>{</span> original_groups.stdout.split(' ') | join(',') <span>}</span><span>}</span>" append: no when: result_user is changed tags: - revert-docker-group </code></pre> <h2 id="How to use"><a href="#How+to+use">How to use</a></h2> <h3 id="Directory"><a href="#Directory">Directory</a></h3> <pre><code class="bash">$ ansible-playbook -i 'username@hostname,' install_awx.yml </code></pre> <h3 id="Uses inventory file"><a href="#Uses+inventory+file">Uses inventory file</a></h3> <p>Create the following <code>inventory</code> file:</p> <pre><code class="ini">hostname [all:vars] ansible_ssh_user=username #http_proxy=http://proxy:3128 #https_proxy=http://proxy:3128 #no_proxy=mycorp.org </code></pre> <p>and run below</p> <pre><code class="bash">$ ansible-playbook -i inventory install_awx.yml </code></pre> <h2 id="解説"><a href="#%E8%A7%A3%E8%AA%AC">解説</a></h2> <p>一番大きなポイントは、 Python の Virtualenv を作成し、そこに pip 版 docker-compose を入れて動かしていることだ。</p> <h3 id="docker-compose Python 依存パッケージの競合"><a href="#docker-compose+Python+%E4%BE%9D%E5%AD%98%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E7%AB%B6%E5%90%88">docker-compose Python 依存パッケージの競合</a></h3> <p>AWX を docker-compose でインストールするには、 <a target="_blank" rel="nofollow noopener" href="https://pypi.org/project/docker-compose/">docker-compose</a> Python モジュールのインストールが必要だ。<br /> しかし、 OS のパッケージマネージャ (yum) でインストールしているモジュールと、 上記 docker-compose Python module で、一部の依存パッケージが競合していたりすると、 pip で global な環境に docker-compose pip モジュールをインストールしようとした時に、</p> <pre><code>"Cannot uninstall 'requests'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall." </code></pre> <p>などというようなエラーが発生してしまうことがある。</p> <p>このため、 Virtualenv 環境を作成して、そこに docker-compose をインストールする形としている。</p> <h3 id="yum でインストールしたモジュールへの依存"><a href="#yum+%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%B8%E3%81%AE%E4%BE%9D%E5%AD%98">yum でインストールしたモジュールへの依存</a></h3> <p>一方、 逆に パッケージマネージャ (yum) でインストールしているモジュールそのものに依存している場合、 単に Virtualenv を作成しただけだと、モジュール不足で動かなくなることがある。<br /> このため、 <a target="_blank" rel="nofollow noopener" href="https://docs.ansible.com/ansible/latest/modules/pip_module.html">Ansible の pip モジュール</a> を使うときは、 <code>virtualenv_site_packages: yes</code> を設定している。</p> <pre><code>"source <span>{</span><span>{</span> venv_dir+'/bin/activate' | quote <span>}</span><span>}</span>; ansible-playbook -i inventory install.yml <span>{</span><span>{</span> install_awx_playbook_opotions <span>}</span><span>}</span>" </code></pre> <p>最後に playbook 内で AWX のインストール playbook を実行する際は、上記のように Virtualenv を activate した状態で実行している。</p> <h3 id="docker グループへの追加"><a href="#docker+%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%B8%E3%81%AE%E8%BF%BD%E5%8A%A0">docker グループへの追加</a></h3> <p>ssh でログインしたユーザが docker コンテナの操作を行えるようにするため、 一時的に docker グループへ追加している。</p> <p>グループを変更しても、 ホストマシンにログインし直さないと、設定が反映されず docker を操作することができない。<br /> 本来であれば、 Ansible の meta モジュールの reset_connection のアクションで ssh でのサインインが自動的にやり直されるはずなのだが、何故かうまく動かない。</p> <p>このため、 ホストPC の sshd デーモンを非同期で Kill させることで、強制的に ssh の再接続を行っている。</p> <h3 id="プロキシの解決"><a href="#%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%AE%E8%A7%A3%E6%B1%BA">プロキシの解決</a></h3> <p>プロキシの設定は、以下の両方が必要だ。</p> <ul> <li>docker イメージをダウンロードするための、コンテナホストへの設定</li> <li>docker コンテナ内への設定</li> </ul> <p>playbook 実行時のオプションとして <code>ansible-playbook -i 'username@hostname,' -e http_proxy=http://proxy.example.com -e http_proxy=http://proxy.example.com install_awx.yml</code> のように設定できるほか、<br /> その設定を省略した場合でも、 コンテナホストマシンの http_proxy 環境変数などが設定されていれば、それを使うようにしている。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sat0ken/items/ee820752e97591ea2012">AWXをインストールしてCatalystにPlaybookを実行してみる - Qiita</a> <ul> <li>最初はこちらページに書かれたコードで実行しようとしたが、 現在の AWX の最新版 (6.x, 7.x) ではインストールできなかった。</li> </ul></li> </ul> <h2 id="更新履歴"><a href="#%E6%9B%B4%E6%96%B0%E5%B1%A5%E6%AD%B4">更新履歴</a></h2> <ul> <li>2019-10-23: 初版</li> <li>2019-11-22: CentOS 7 と <code>docker-compose==1.25.0</code> の組み合わせで発生する不具合を回避。 AWX のバージョンを 9.0.1 に更新。</li> </ul> advanceboy tag:crieit.net,2005:PublicArticle/14464 2018-06-04T15:12:19+09:00 2018-09-27T03:32:45+09:00 https://crieit.net/posts/Mac-WindowsOS MacにWindowsOSを入れて動かしてみる <p>タイトルを見て『WindowsPC使えばいいじゃん』と思った方...。<br /> その通りなんです。</p> <p>WindowsPCを使えばいいんです...!</p> <p>しかし、それだと、この記事が終了してしまうので、せっかくなのでやってみましょう!<br /> MacOSにWindowsOSを入れて動かしてみます。<br /> 正確にはMacにあるVirtualBoxにWindowsOSを入れて動かしてみます。</p> <h1 id="なぜMacにWindowsOSを入れたいのか?"><a href="#%E3%81%AA%E3%81%9CMac%E3%81%ABWindowsOS%E3%82%92%E5%85%A5%E3%82%8C%E3%81%9F%E3%81%84%E3%81%AE%E3%81%8B%EF%BC%9F">なぜMacにWindowsOSを入れたいのか?</a></h1> <p>MacでWebアプリケーションを開発しているときに、IEやedgeといったマイクロソフトが提供している<br /> ブラウザでテストをしなければならない場面がありました。</p> <p>シミュレーターで表示した場合と、WindowsのPCで表示した場合で異なる結果になることが多々ありました。<br /> 結局『WindowsOSでIEを開かないと意味がない』という結論になりました。</p> <p>WindowsPCも渡されていますが、テストのためだけに電源を入れるのって億劫ですよね...。<br /> なのでVirtualBoxにWindowsOSを入れて、テストの時だけ立ち上げてIEとedgeで確認をしたいというのが、発端になります。</p> <h1 id="1.VirtualBoxをインストール"><a href="#1.VirtualBox%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1.VirtualBoxをインストール</a></h1> <p>まずはVirtualBoxをインストールします。(VirtualBoxはLinuxを利用したOSの一つであり無償で利用できます)</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.virtualbox.org/wiki/Downloads">https://www.virtualbox.org/wiki/Downloads</a></p> <h1 id="2.WindowsOSのvirtual machinesをインストール"><a href="#2.WindowsOS%E3%81%AEvirtual+machines%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">2.WindowsOSのvirtual machinesをインストール</a></h1> <p>実はテスト用のバーチャルマシンをマイクロソフトが提供しています。<br /> ※かなり重厚なため覚悟したほうがいいです...。<br /> <a target="_blank" rel="nofollow noopener" href="https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/#downloads">https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/#downloads</a></p> <p><a href="https://crieit.now.sh/upload_images/9e991b5301f2abffe31d7201ed6520695b14cffdc7fd0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9e991b5301f2abffe31d7201ed6520695b14cffdc7fd0.png?mw=700" alt="スクリーンショット 2018-06-04 14.36.25.png" /></a></p> <h1 id="3.VirtualBoxを立ち上げてOSファイルをインポートする"><a href="#3.VirtualBox%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%81%A6OS%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B">3.VirtualBoxを立ち上げてOSファイルをインポートする</a></h1> <p>『ファイル』 → 『インポート』から先ほどインストールしたファイルをインポートします。</p> <p><a href="https://crieit.now.sh/upload_images/2987a85143f937dc52645014c09341b45b14d43c41cf3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2987a85143f937dc52645014c09341b45b14d43c41cf3.png?mw=700" alt="スクリーンショット 2018-06-04 14.54.52.png" /></a></p> <h1 id="4.インポートしたOSを起動する"><a href="#4.%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%9FOS%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B">4.インポートしたOSを起動する</a></h1> <p>インポートしたバージョンのOSが左に出てくるので起動します。</p> <p><a href="https://crieit.now.sh/upload_images/da3115714e08eb13fa13dfa02668d6745b14d4a705e2f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/da3115714e08eb13fa13dfa02668d6745b14d4a705e2f.png?mw=700" alt="スクリーンショット 2018-06-04 14.56.28.png" /></a></p> <h1 id="4.IE、edge起動!"><a href="#4.IE%E3%80%81edge%E8%B5%B7%E5%8B%95%EF%BC%81">4.IE、edge起動!</a></h1> <p>MacでWindowsOSが立ち上がりました!<br /> edgeとIEを確認してみます。</p> <h3 id="edge確認"><a href="#edge%E7%A2%BA%E8%AA%8D">edge確認</a></h3> <p><a href="https://crieit.now.sh/upload_images/41795a780e976156296be8c50e5a79ec5b14d6462c8e9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/41795a780e976156296be8c50e5a79ec5b14d6462c8e9.png?mw=700" alt="スクリーンショット 2018-06-04 15.02.30.png" /></a></p> <h3 id="IE確認"><a href="#IE%E7%A2%BA%E8%AA%8D">IE確認</a></h3> <p><a href="https://crieit.now.sh/upload_images/452b4cb98ebfa46b81480dd4d4e409de5b14d639ac64f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/452b4cb98ebfa46b81480dd4d4e409de5b14d639ac64f.png?mw=700" alt="スクリーンショット 2018-06-04 15.03.09.png" /></a></p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>かなり面倒くさいし、PCにも負荷をかけるのでWindowsPCを確保して確認するのが一番いいと思います。</p> <p>参考↓↓<br /> <a target="_blank" rel="nofollow noopener" href="http://www.wegirls.tech/entry/2017/03/07/195733">http://www.wegirls.tech/entry/2017/03/07/195733</a></p> フジワラ@CLOCK tag:crieit.net,2005:PublicArticle/14452 2007-07-14T19:07:48+09:00 2019-08-21T11:40:34+09:00 https://crieit.net/posts/Ajax Ajaxが使えないサーバー <p>こんな症状が発生。</p> <p>Ajaxリクエストを行うと失敗するのだが、以下のような条件。</p> <p>IEでcss等 … 成功<br /> IEでphpファイル … 失敗<br /> FireFox?でphpファイル … 成功<br /> 別のサーバーでIEでphpファイル … 成功</p> <p>つまり、特定のサーバーでphpファイルのリクエストを行うと<br /> 失敗してしまうという現象。</p> <p>原因は、apacheの設定で<br /> AddDefaultCharset none</p> <p>とするとこうなるらしい。<br /> ちゃんと</p> <pre><code>#AddDefaultCharset </code></pre> <p>という風にしなければならない。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14453 2007-06-19T21:06:04+09:00 2007-06-19T21:06:04+09:00 https://crieit.net/posts/RAID1 RAID1の設定 <p><a target="_blank" rel="nofollow noopener" href="http://www.ysd.bne.jp/linux/raid.htm">http://www.ysd.bne.jp/linux/raid.htm</a><br /> や<br /> <a target="_blank" rel="nofollow noopener" href="http://tangiku.net/wiki/index.php?Ce­ntOS%A4%C7%A5%BD%A5%D5%A5%C8%A5%A6%A 5%A7%A5%A2RAID">http://tangiku.net/wiki/index.php?Ce­ntOS%A4%C7%A5%BD%A5%D5%A5%C8%A5%A6%A 5%A7%A5%A2RAID</a><br /> を参考にしたら出来た。</p> <p>bootが後者と同じくmd0にあったので、</p> <blockquote> <p>||<br /> grub-install --root-directory=/boot /dev/hda<br /> ||<br /> にしたら、再起同時に見事にgrubの画面で止まった。<br /> しょうがないので</p> <p>||<br /> configfile /grub/grub.conf<br /> ||<br /> で復活できます。</p> </blockquote> <p>原因は上記コマンドだと/boot/boot/grubを見てしまうために<br /> 設定ファイルが足りないから。<br /> 色々と変な情報が行き交ってて訳がわからなかったが、<br /> とりあえず以下が正しいよう。</p> <blockquote> <p>||<br /> grub-install --root-directory=/ /dev/hda<br /> ||<br /> あとは参考URLに書いてあるとおりにしたら出来た。</p> </blockquote> だら@Crieit開発者