2024年4月10日水曜日

自分のサーバーにサイト追加する方法(自分でサーバーいじる場合)

こんばんは、こうちゃんです。

自分でサイトを持っていて運営している際などに、主にVPSのような自分で構築したサーバーでサイトを増やす手順です。

ある程度マニアックな情報になってしまいますが、
私自身がサイトを増やす際のマニュアル、覚書的に役立てるためと、
同じような状況で、まだあまり慣れていない方に役立つように、作業メモを残しておきます。

サイト追加手順
※ドメイン取得サイトはどこか定番大手などでアカウント登録して使ってください

1.ドメイン管理サイトにて希望するURLになる新ドメイン取得

2.DNS設定でレコード追加
基本的には、Aレコードで自身の持っているサーバーのIPアドレスに向ける(サーバー管理会社がドメイン設定を指定している場合はそれに従う)
 A サーバーIPアドレス

3.ネームサーバ設定はほとんどのドメイン管理会社で設定不要だが、明示するように書いてある場合はその使用しているドメイン管理会社のネームサーバーを使用するように設定

4.FTPソフト等を使い、WEB用アップフォルダに新ドメイン名等でフォルダを作成し、コンテンツアップロード

(以降サーバーにssh接続でコマンドライン)
5./etc/httpd/conf.d/virtualhost.conf編集
新ドメイン用設定書き加え(↓はfuelの場合、一般サイトなら/public/は不要)
<VirtualHost *:80>
DocumentRoot /var/www/html/ドメイン名/public/
ServerName ドメイン名
</VirtualHost>

6.service httpd restart で新ドメインにアクセスして見えることを確認

↑単にhttp://ドメイン名で新サイトを見るだけの場合はここまでで完了
↓新サイトをさらにssl化してhttps://ドメイン名でアクセスできるようにする場合以下も実行

7.ssl証明書発行&インストール
cd /etc/letsencrypt/
./letsencrypt-auto certonly --webroot -w ドキュメントルート(fuelなら/publicまで含む/) -d ドメイン名
※サーバーのPythonバージョンが低くてエラーが出る場合、Python2.7を有効に↓してから上記コマンド実行
sudo scl enable python27 bash

8.https設定
vi /etc/httpd/conf.d/ssl.conf
既存https設定のブロックをコピーしてドメイン名だけ書き換えて追加(↓具体例)
<VirtualHost *:443>
   ServerName ドメイン名
   DocumentRoot "/var/www/html/ドメイン名/public"

   SSLEngine on
   SSLHonorCipherOrder on
   Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
   SSLProtocol all -SSLv2
   SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES

   SSLCertificateFile /etc/letsencrypt/live/ドメイン名/cert.pem
   SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
   SSLCertificateChainFile /etc/letsencrypt/live/ドメイン名/chain.pem

    <Directory "/var/www/html/ドメイン名/public">
        Options FollowSymLinks
        AllowOverride All
    </Directory>

    SetEnvIf Request_URI "\.(gif|jpg|png|css|js)$" nolog
    ErrorLog logs/ssl_error_log
    CustomLog logs/ssl_access_log combined env=!nolog

</VirtualHost>

9.サーバー再起動
service httpd restart
https//ドメイン名/でエラーなく見れるか確認

10.SSL証明書は3ヶ月で切れるので毎月初日に自動更新
crontab -e

最終行に追加
00 04 01 * * /etc/letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/html/ドメイン名/public/ -d ドメイン名 --renew-by-default && /etc/init.d/httpd restart

※前の手順でpythonのバージョンエラーなど出てた場合、このコマンド時にもpythonのエラーによりうまく動かない可能性もあります。
その場合、crontab自体に、pythonの強制コマンド入りで登録しましょう

00 04 01 * * sudo scl enable python27 bash && /etc/letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/html/ドメイン名/public/ -d ドメイン名 --renew-by-default && /etc/init.d/httpd restart

これでほぼOKのはずですが、ちゃんと証明書が更新されたかなどは、crontab自体が動いたかの確認と、実際のサイトで証明書日付の確認などをしましょう(まあ一回ちゃんと動いたのを確認すればほぼ大丈夫ですが)。

vi /var/log/cron
などでcrontabのログを確認できます。
少し古い場合、/var/logフォルダ内を探して cron日付-日付になっていたりするのが過去ログ分です。


ドメイン引っ越しの場合
上記手順で引っ越し先のドメインでサイトを見れるようになったら、
引っ越し元ドメインのルート(URL叩いたら見れる階層)に、
.htaccess ファイルを作成し、中身を
Redirect permanent / 引っ越し先URL
と書いてアップ、これでURLを構造ごと転送がかかるようになる
こうしないと、全ページ、新URLのトップに転送とかかけちゃうとインデックスや各ページのSEO評価が引き継がれなくなってしまう

以上のような流れで新サイトをサーバーに追加できます。
もちろん既存のサーバー設定等で必ずしも上記通りにいくとは限りませんが、かなりの部分で参考にはなると思います。

こうちゃん

2024年4月3日水曜日

SVGファイル

こんばんは、こうちゃんです。

昨今人気の画像ファイル形式のSVGファイルですが、
拡大・縮小しても画質が劣化しない、とレスポンシブデザインのサイトなどに親和性がよいため、広く普及してきています。

このSVGファイルとはどのようなものか、などを今日はご説明していこうかと思います。

SVGファイルとは、Scalable Vector Graphics(スケーラブル・ベクター・グラフィックス)の略で、
webサイトで多くのケースで使われているJPG、PNG、GIFなどの画像ファイルが、ラスタ形式なのに対して、SVGはベクトル形式の画像です。
これは、ラスタ形式のJPGファイルなどは、画像の中身を、ピクセルを縦横に並べる方法で記録しており(言うなれば座標毎に色をふっているような)、そのため、画像を拡大すると粗くなり、縮小すると、欠けてしまったりします。
作ったサイズから変えるのに不便で、サイト等で使うと、パソコンで見た時には普通なのに、残念ながらスマホで見ると拡大されてギザギザの粗が目立つ、なんてこともよくあります。
それに対して、ベクトル形式でできているSVGファイルは、XMLベースの二次元画像データで、画像の情報を座標を結ぶ直線などの情報で記録しているため、拡大・縮小しても劣化が起きにくい形式です。
サイトなどでレスポンシブデザインを使い、パソコンやスマホなど画面解像度の異なる環境で見られる機会の多い近年のwebサイトに対してとても相性がよいです。

SVG(Scalable Vector Graphics)ファイルの魅力はいくつかあります。以下にそのいくつかを挙げてみます:

1. **拡大縮小に対応**: SVGファイルはベクター形式であり、画像を拡大・縮小しても画質が劣化せず、クリアな表示が可能です。これは、Webデザインや印刷物など、さまざまな用途で重要です。

2. **編集しやすい**: SVGファイルはテキストベースで記述されているため、編集が容易です。SVGファイルをテキストエディタで開いて編集することができ、色や形状、サイズなどを自由に変更できます。

3. **アニメーションやインタラクティブ要素の追加**: SVGファイルにはアニメーションやインタラクティブな要素を追加することができます。これにより、Webサイトやアプリケーションで動的なコンテンツを作成することが可能です。

4. **軽量化**: SVGファイルは一般的に他の画像形式よりもファイルサイズが小さく、高品質な画像を提供できるため、Webサイトのパフォーマンス向上にも貢献します。

5. **検索エンジン最適化(SEO)**: SVGファイルはテキストベースであるため、検索エンジンがコンテンツを理解しやすく、SEOの観点からも有利です。

これらの特性により、SVGファイルは多くのデザイナーや開発者にとって魅力的なファイル形式となっています。

そんなSVGファイルですが、時に事情により(使用できるファイルフォーマットが限られるなど)、JPGファイルなどと形式を変換する必要が出てくる場面もあり、そのような時は、SVGファイルを作成できるIllustratorやphotoshopなどで変換することもできますが、そもそもソフトを持っていなかったりソフトを起動して変換する手間を考えると、web上でできてしまうと大変便利で、
最近ではそうしたサービスを行ってくれる(しかも無料)サイトも登場しています。

https://www.aconvert.com/jp/image/svg-to-jpg/

画像ファイルをそのフォーマットから、好きな形式に変えてくれる、しかも、ネット上に挙がっている画像でもOKという、大変便利な夢のようなサービスです。

よろしければ画像形式の違いに悩んだ際などにはご利用してみてください。



こうちゃん

Deprecatedエラーを消す方法

こんばんは、こうちゃんです。

PHPでプログラミングをしていますと、やや昔に作ったシステムを、
最新のPHPバージョンのサーバーに乗せ換えて動かすこともよくあります。

このような場合に、PHPの古いバージョンでは使えていた関数等で、
今後廃止になる予定や、非推奨のものの場合、動かすと、
画面に、
Deprecatedエラー
が出てしまうことがあります(もちろんエラー表示の設定次第ですが)。

この非推奨エラーは、どうしてもPHPの仕様で、今後の警告のために設定されているものですので仕方ありませんが、
これが画面に出てしまう場合、色々と具合が悪いものです。
自分で使うシステムでも、他者が見るものや、一般ユーザーが見るものでも。

こうした場合は、サーバーのphp関連で設定に干渉できる場所を使って、画面に出てしまわないようにしましょう。
※もちろん直せるのならば、推奨のロジックに直せれば一番ですが、そう都合よくもいかないでしょうし

方法としてはいくつかありまして、

1.php.iniに書く場合
php.iniではそのサーバー上で動く全部のPHPの設定の基になる部分ですので、
ここをいじれるのであれば、今後のためにもそれが一番です。
error_reporting設定のところを探し

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED

というように、Deprecatedエラーを非表示にします。

2.PHPソースに書く場合
レンタルサーバーなどでphp.iniを編集はできない場合で、そのPHP動作ファイルでだけ起きるような場合には、もういっそ、そのPHPファイルの文頭で宣言してしまい、そのファイルでエラー表示されないようにしてしまうのも手です。
<?php タグで記載している部分に

error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);

と記載します。

3.httpd.confや.htaccessに書く場合
php.iniは操作できないものの、そのサーバー上で動く多くのPHPファイルでエラーが出てしまい、一括で直したい場合は、
もしもapacheの設定ファイルがいじれるのならば、httpd.confに
php.ini同様、httpd.confもいじれないなら(レンサバは多い)、
.htaccessに

php_value "error_reporting" "E_ALL & ~E_NOTICE & ~E_DEPRECATED"

を記載します。

このいずれかの方法で、今後の
Deprecatedエラー表示は抑制できます。

※.htaccessやphpファイル文中に記載して設定した場合は即時反映されますが、
php.iniやhttpd.confを変更したときにはApache(webサーバ)の再起動が必要です。注意してください。

こうちゃん

2024年3月19日火曜日

MAX_QUERIES_PER_HOURでデータベース繋がらない

こんばんは、こうちゃんです。

先日開発中のサイトで突如データベースに繋がらなくなり困ってしまう事態が起きまして、
未来のために原因や解決方法等を備忘録代わりに残しておきますー。

まず、プログラム整備中のサイトにある時アクセスしたら、

has exceeded the 'max_connections_per_hour' resource (current value: 〇〇) i
n

みたいなエラーが出てデータベースに接続するプログラムがエラーで通らなくなってしまいました。
困ったことにこれ、エラー発生原因部分のプログラム消しても何しても一定時間アクセスできなくなってしまうんですね。
何もできないので、その間に、このエラーの原因や対処方法を確認しまして、一応の解決をしましたのでそのあたりのご説明を。

まずエラーに関しては、単純にエラーの英語文通りで、
プログラムで、一時間以内に、
MySQLの、max_connections_per_hour、という設定値以上のセッションを張ってしまったことが原因です。
この値はMySQLユーザーごとの設定ではありますが、
だいたいサイト開いた時に実行プログラム内で、どのユーザーで繋ぐかは決まっているのがほとんどですので、例えば、データを引き出すのに10クエリ発する画面があったとして、その画面を1時間以内に100回開かれれば、1000セッションを張ったことになり、設定値が1000であれば、これでもうエラーに引っ掛かります。

説明でも、
時間単位の接続数: 1時間で新しく開ける接続
これ、私のレンタルサーバーでは1500になっていたのですが、
1時間に新しく開ける接続、てことは、シンプルにサイトを見たら、トップページでSQL使っていたらどんなに工夫してあっても、1接続は発生しますよね、てことは1時間以内にちょっとアクセスが集中しただけでもうお陀仏なんじゃ・・・
なんて設定でしょうねえ。

公式にも
サーバーが実行されると、各アカウントがリソースを使用する回数がカウントされます。過去 1 時間以内にアカウントが接続数に対する制限に達した場合は、その時間が経過するまで、そのアカウントによる以降の接続が拒否されます。
てなってますし。

さすがにこれじゃ使い物にならないので、
解決するためには、まずはプログラムの方は最適化して、むやみにデータベースに対してコネクションを張らないように(必要最低限)するのはもちろんとして、
その上で、この設定値をかなり引き上げておくか、それでもいつかオーバーすることを予期して、規制を停止するかのいずれかがよいかと。

既定数を変更する場合、

GRANT USAGE ON *.* TO 'ユーザー名'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 数字;

とSQL発行して、数字で最大数を決めればその数値になります。
また、そもそも最大数を制御したくない(規制しない)場合はこの数値を0にします。

GRANT USAGE ON *.* TO 'ユーザー名'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0

これで今後この制御は外れます。
といっても、むやみにコネクションを増やさないようなシステム作りも心がけた方がよいのも言うまでもないですが。

こうちゃん

2024年2月16日金曜日

chromeのシークレットモード

こんばんは、こうちゃんです。

いつも使っていて大変便利なgoogle先生作の優秀ブラウザ、
chromeですが、もちろん普通に使っていても大変便利で使いやすいんですが、
サイトに情報が残ったり、chrome自体にgoogleアカウントでログインしておりますと、
自身のID、パスワードを記憶してしまったりします。

そんな時に、大事な情報を一切残さずサイトに訪問したい場合、
chromeにはデフォルトで便利な機能が搭載されています。

シークレットモードです。

こちら、使い方は、ブラウザ右上の設定アイコン(縦〇みっつ)をクリック
シークレットウィンドウを開く、をクリックしてください。

そうしますと、普段はタブが白いchromeですが、
タブの黒いウィンドウが開きます、こちらがシークレットモードを使える状態のブラウザになります。

以降は普通のブラウザとして使用できますし、
通常時に登録したブックマークなども使えます。

ただし、この状態では、開いた段階でcookieもセッションもクリアされており、また、その状態で使ったブラウザの情報、閲覧履歴やフォームに入力した内容は記録されません。
また、ブラウザを開いている間は閲覧しているサイトでcookieやパスワードは利用できますが、そのシークレットウィンドウを閉じた際にcookieもきれいにクリアされます。
例えばパソコンが共用パソコンである時など、他のユーザーに操作内容が知られずに使うことができるという便利機能になります。

なお、シークレットモード中にダウンロードしたファイルなどはそのまま残り続きますので、ご注意ください。

また、もしも通常のchrome使用中に、
特定のサイトを開く時だけいつもシークレットウィンドウにしたい、などの場合は、
大変便利なchromeのextensionのひとつ

Incognito Filter

を使うといつでも実現できます。
このextensionを入れて、アイコンから指定したいサイトURLを登録したり、利用したいサイト開き中にアイコンクリックから設定することができます。
これにより、日常のサイト閲覧、ネットサーフィンなどで、特定のサイトを開く時に、履歴や入力データを残さずに済むので便利です。

こうちゃん

2024年1月17日水曜日

FTPで425エラー!?

こんばんは、こうちゃんです。

私は本業で多くのサイトを作成・管理しておりまして、
つい先日、いつものように大量管理しているサイトの操作中、
あるサーバーにFTPで繋ぎまして、ファイル操作をしようとしましたら・・・

ffftpにて(FTP用フリーソフトです)
425 Unable to build data connection: Operation not permitted

!?
どいうこと!?
いつも使っててこんなエラー出てなかったんですけどーーーー

仕方ない、だいたいFTPでのこんなエラーなんてのは、過去の賢人達も一度はぶつかっていて、同じように悩み、解決してきた歴史があるはず、と調べれば解決するだろうと、
早速エラーメッセージにて検索してみました。

おおう、まずは解決方法は置いておいて、このエラーメッセージが出る時の原因は判明しました。

FTPでは通信時に使うポートが、
制御用コネクション(control connection)と呼ばれる、ファイル転送に関する指示(コマンド)をやりとりするためのもの、デフォルトで21番ポートと、
データ転送用コネクション(data connection)と呼ばれる、データ転送用ポートで、デフォルトで20番ポート、
のふたつを使っているそうで、
425エラーは、まずは、
425 Unable to build data connection
という部分があり、データ転送用コネクション(data connection)を確立できなかった(接続できなかった)ことを示しています。

原因としては、セキュリティで20番ポートが閉じられている場合や、
今回のエラーメッセージのように、
Operation not permitted
と出ていれば、権限不足等でポート確立が許可されていない場合です。

これはFTPクライアントでなく、サーバーのFTPサーバー側の設定なので、
見直しで、暗号化通信を強制する「TLSRequired on」となっているときに発生するようで、対策としては、
proftp.confを開いて、

TLSOptions NoSessionReuseRequired
という行を追記、FTPサーバーを再起動することで直ります。

他、そもそも、ファイア・ウォールなどのセキュリティ設定で20番ポートを閉じている場合も接続できませんので、その場合、アプリケーション層で対処でなく、サーバー管理者に確認の上、20番ポートをふさいでいないか、解放できないか、の相談をするとよいでしょう。

こうちゃん