Ubuntu 20.04でLNMP環境を構築する方法

Ubuntu 20.04でLNMP環境を構築する方法

簡単な説明

以前 Centos7 で構築し、その後個人開発環境として Ubuntu 20.04 を使っていたため、Ubuntu でも環境を構築したいと考えました。 Centos とは若干異なる部分もあるため、学習用として記録しておきます。

インストール前の準備

ソフトウェアをダウンロード:
php:7.3.18
nginx: 1.18.0
マリアdb:10.5.4

ファイルを解凍します:

tar zxf php-7.3.18.tar.gz
tar zxf mariadb-10.5.4.tar.gz
tar zxf nginx-1.18.0.tar.gz 

Nginxをインストールする

sudo groupadd -r nginx && sudo useradd -r -g nginx -s /sbin/nologin -d /usr/local/nginx nginx
sudo apt install -y libpcre3-dev zlib1g-dev
cd /home/allen/Downloads/nginx-1.18.0
./configure --user=nginx --group=nginx
make -j 4 && sudo make install
sudo /usr/local/nginx/sbin/nginx -t
#nginx: 設定ファイル /usr/local/nginx/conf/nginx.conf の構文は正常です
#nginx: 設定ファイル /usr/local/nginx/conf/nginx.conf のテストが成功しました
sudo mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.back
sudo vim /usr/local/nginx/conf/nginx.conf

ユーザー nginx;
ワーカープロセス 4;
イベント {
  ワーカー接続 1024;
}
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト65;
  log_format main '$remote_addr || $remote_user || $time_local || $request || $status || $body_bytes_sent || $http_referer || $http_user_agent || $http_x_forwarded_for';
  /data/www/*/*.conf をインクルードします。
} 

sudo chown -R nginx:nginx /usr/local/nginx

sudo vim /lib/systemd/system/nginx.service

[ユニット]
説明=nginx
後=ネットワーク.ターゲット

[サービス]
タイプ=フォーク
実行開始=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s 再ロード
ExecStop=/usr/local/nginx/sbin/nginx -s 終了
プライベートTmp=true

[インストール]
WantedBy=マルチユーザー.ターゲット


sudo systemctl nginx を有効にする

# シンボリックリンク /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service を作成しました。

リブート

再起動後、正常に起動するか確認します。

Mariadbをインストールする

sudo rm -rf /etc/mysql
sudo apt 削除 -y mysql-common
sudo apt 自動削除 -y
sudo apt install -y cmake libncurses5-dev libgnutls28-dev
sudo groupadd -r mysql && sudo useradd -r -g mysql -s /sbin/nologin -d /usr/local/mariadb mysql
sudo mkdir -p /data/db /var/log/mariadb
cd /home/allen/Downloads/mariadb-10.5.4/
cmake 。-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb -DMYSQL_DATADIR=/data/db -DSYSCONFDIR=/etc -DWITHOUT_TOKUDB=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci
make -j 4 && sudo make install
sudo /usr/local/mariadb/scripts/mysql_install_db --user=mysql --datadir=/data/db
sudo vim /etc/my.cnf

[mysqld]
データディレクトリ = /data/db
ソケット = /tmp/mysql.sock
# さまざまなセキュリティリスクを防ぐためにシンボリックリンクを無効にすることをお勧めします symbolic-links = 0
照合サーバー = utf8mb4_general_ci
init-connect = '名前を設定する utf8mb4'
文字セットサーバー = utf8mb4

[mysql]
デフォルトの文字セット = utf8mb4

[クライアント]
ポート = 3306
ソケット = /tmp/mysql.sock
デフォルトの文字セット = utf8mb4

[mysqld_safe]
ログエラー = /var/log/mariadb/mariadb.log
pid ファイル = /var/run/mariadb/mariadb.pid

sudo cp /usr/local/mariadb/support-files/mysql.server /etc/init.d/mariadb

sudo vim /etc/profile.d/mariadb.sh
エクスポート PATH=$PATH:/usr/local/mariadb/bin/

sudo chmod 0777 /etc/profile.d/mariadb.sh
ソース /etc/profile.d/mariadb.sh

sudo /etc/init.d/mariadb を起動します
#mariadb を起動しています (systemctl 経由): mariadb.service。

sudo /usr/local/mariadb/bin/mysql_secure_installation 	 

#注意: このスクリプトのすべての部分を実行することは、すべてのMariaDBで推奨されます。
# 本番環境で使用されているサーバー! 各ステップを注意深くお読みください!

#MariaDBにログインしてセキュリティを確保するには、現在の
#rootユーザーのパスワード。MariaDBをインストールしたばかりで、
#まだルートパスワードを設定していないので、ここで Enter キーを押すだけです。

#ルートの現在のパスワードを入力してください (パスワードがない場合は入力してください): 
#OK、パスワードの使用に成功しました。次に進みます...

#ルートパスワードを設定するかunix_socketを使用すると、誰も
#適切な権限がなくてもMariaDBのルートユーザーにログインできます。

#ルート アカウントはすでに保護されているため、安全に「n」と答えることができます。

#unix_socket認証に切り替える [Y/n] y
#有効化に成功しました!
#権限テーブルを再読み込みしています。
# ... 成功!


#ルート アカウントはすでに保護されているため、安全に「n」と答えることができます。

#ルートパスワードを変更しますか? [Y/n] y
#新しいパスワード: 
#新しいパスワードを再入力してください: 
#パスワードが正常に更新されました!
#権限テーブルを再読み込みしています。
# ... 成功!


#デフォルトでは、MariaDBのインストールには匿名ユーザーがあり、誰でも
#ユーザーアカウントを作成せずにMariaDBにログインするには
#them。これはテストのみを目的としており、インストールを確実にするために
#もう少しスムーズに。
#本番環境。

#匿名ユーザーを削除しますか? [Y/n] y
# ... 成功!

#通常、rootは「localhost」からのみ接続を許可されます。これは
#ネットワークから誰かがルートパスワードを推測できないようにします。

#リモートからのルートログインを禁止しますか? [Y/n] n
# ... スキップします。

#デフォルトでは、MariaDBには誰でも使用できる「test」という名前のデータベースが付属しています。
#access。これもテストのみを目的としており、削除する必要があります
#本番環境に移行する前に。

#テストデータベースとそれへのアクセスを削除しますか? [Y/n] y
# - テスト データベースを削除しています...
# ... 成功!
# - テスト データベースの権限を削除しています...
# ... 成功!

#権限テーブルを再読み込みすると、これまでに加えられたすべての変更が確実に反映されます
#すぐに有効になります。

#権限テーブルを今すぐ再読み込みしますか? [Y/n] y
# ... 成功!

#クリーンアップ中...

#完了です!上記の手順をすべて完了すると、MariaDB
#インストールは安全になるはずです。

#MariaDB をご利用いただきありがとうございます!

sudo systemctl でmariadbを有効にする 

sudo chown mysql:mysql -R /usr/local/mariadb /data/db /var/log/mariadb

リブート

再起動後、正常に起動するか確認します。

PHPをインストールする

sudo apt install -y libxml2-dev libssl-dev libbz2-dev libcurl4-gnutls-dev libjpeg-dev libpng-dev pkg-config libxslt1-dev libzip-dev libfreetype6-dev libfontconfig1-dev autoconf
sudo groupadd -r php && sudo useradd -r -g php -s /sbin/nologin -d /usr/local/php php
sudo vim /etc/sudoers
php ALL=(ALL:ALL) ALL
cd /home/allen/Downloads/php-7.3.18/


./CONFIGURE -PREFIX =/usr/local/php \  -  exec-prefix =/usr/local/php-with-fpm-user = php-with-fpm-group = php-with-curl -with-gettex -pdo-mysql-with-pdo-sqlite -with-pear -with-xmlrpc -with-xsl -with-zlib -with-mhash-with-mhash-bcmath- -enable-sysvsem  -  enable-sysvshm  -  enable-xml -enable-fpm -with-freeType-dir -with-gd-with-libxml-dir -with-pcre-regex-enable-libxml -eenable-zip -with-png-dir -jpeg-dirir

エラーがあります:

configure: エラー: freetype-config が見つかりません。

解決:
言われている:https://www.doopsky.com/ops/981.html

これは、Ubuntu 19.04でapt-getによってインストールされたlibfreetype6-devのバージョンが2.9.1-3であるためです。
http://changelogs.ubuntu.com/changelogs/pool/main/f/freetype/freetype_2.9.1-3/changelog
変更ログには次のように書かれています:

`freetype-config' スクリプトはデフォルトではインストールされなくなりました
(クローズ: #871470、#886461)。libfreetype6-dev に依存するすべてのパッケージ
関連する CFLAGS とライブラリを見つけるには、pkg-config を使用する必要があります。
freetype-config は pkg-config に置き換えられ、新しいバージョンでは pkg-config を使用して CFLAGS とライブラリを管理します。

したがって、解決策は次のようになります。
主なアイデアは、freetype-config の代わりに pkg-config を使用することです。上記ですでにインストールしたpkg-configをインストールします。

cat ./configure | grep "freetype-config" -n
34847: テスト -f "$i/bin/freetype-config"; の場合
34849: FREETYPE2_CONFIG="$i/bin/freetype-config"
34855: as_fn_error $? "freetype-config が見つかりません。" "$LINENO" 5
36568: テスト -f "$i/bin/freetype-config"; の場合
36570: FREETYPE2_CONFIG="$i/bin/freetype-config"
36576: as_fn_error $? "freetype-config が見つかりません。" "$LINENO" 5

sed -i "s/freetype-config/pkg-config/g" ./configure
cat ./configure | grep "FREETYPE2_CONFIG --cflags" -n
34858: FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags`
36579: FREETYPE2_CFLAGS=`$FREETYPE2_CONFIG --cflags`

sed -i "s/FREETYPE2_CONFIG --cflags/FREETYPE2_CONFIG freetype2 --cflags/g" ./configure
cat ./configure | grep "FREETYPE2_CONFIG --libs" -n 
34859: FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs`
36580: FREETYPE2_LIBS=`$FREETYPE2_CONFIG --libs`

sed -i "s/FREETYPE2_CONFIG --libs/FREETYPE2_CONFIG freetype2 --libs/g" ./configure
cat ./ext/gd/config.m4 | grep "freetype-config" -n
188: テスト -f "$i/bin/freetype-config"; の場合
190: FREETYPE2_CONFIG="$i/bin/freetype-config"
196: AC_MSG_ERROR([freetype-configが見つかりません。])

sed -i "s/freetype-config/pkg-config/g" ./ext/gd/config.m4

再コンパイルしてインストールOK

PHPをご利用いただきありがとうございます。

make -j 4 && sudo make install

sudo cp php.ini-production /usr/local/php/lib/php.ini

sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

vim /usr/local/php/etc/php-fpm.d/www.conf
リスンモード = 0666
午後最大子供数 = 128
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
午後最大リクエスト数 = 10000
スローログ = log/$pool.log.slow
制限ファイル数 = 1024

sudo vim /etc/profile.d/php.sh
エクスポート PATH=$PATH:/usr/local/php/bin/

sudo chmod 0777 /etc/profile.d/php.sh && ソース /etc/profile.d/php.sh

sudo cp sapi/fpm/php-fpm.service /etc/systemd/system/php.service

xdebugをインストールする

xdebug をダウンロード http://pecl.php.net/get/xdebug-2.9.6.tgz

cd /home/allen/download tar zxf xdebug-2.9.6.tgz
xdebug-2.9.6 を CD してください
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make -j 4 && sudo make install

Apcuのインストール

Apcu をダウンロード http://pecl.php.net/get/apcu-5.1.18.tgz

cd /home/allen/Downloads tar zxf apcu-5.1.18.tgz
cd apcu-5.1.18
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make -j 4 && sudo make install

PHP.INIを編集する

須藤 
vim /usr/local/php/lib/php.ini

date.timezone = Asia/上海
expose_php = オフ
最大実行時間 = 0
メモリ制限 = 4096M
display_errors = オン
cgi.fix_pathinfo=0
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/"
拡張子=pgsql
拡張子=apcu

zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so
[xデバッグ]
xdebug.var_display_max_children=10240
xdebug.var_display_max_data=20480
xdebug.var_display_max_depth=50

起動する

sudo systemctl php-fpm を有効にする

sudo chown -R mysql:mysql /usr/local/mariadb
sudo chown -R nginx:nginx /usr/local/nginx
sudo chown -R php:php /usr/local/php
リブート

Ubuntu 20.04 で LNMP 環境を構築する手順については以上です。Ubuntu 20.04 で LNMP を構築する手順の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Ubuntu は Docker をベースに LNMP+Redis 開発環境を構築します (画像とテキスト)

<<:  MySQL サーバーの接続、切断、および cmd 操作

>>:  ノードにおけるhttpモジュールの使用と実行プロセス

ブログ    

推薦する

Reactの基本のまとめ

目次序文始めるReactライフサイクルリアクトファイバーリアクトセットステートReactイベントメカ...

MySQL スライディング集計/年初来集計の原理と使用例の分析

この記事では、例を使用して、MySQL スライディング集計/年初来集計の原理と使用方法を説明します。...

MySQL でデータ テーブルを作成し、主キーと外部キーの関係を確立する方法の詳細な説明

序文MySQL テーブルの主キーと外部キーを作成するときは、次の点に注意する必要があります。主キーと...

入力と画像を揃えるためにvertical-alignを使用します

input と img を同じ行に配置すると、img タグが常に input より 1 つ上になり、...

入力が正しいにもかかわらず、MySQL 8.0 でアクセスが拒否される問題を解決する

最近、MySQL を学び始めました。インストールはスムーズに進み、インターネット上の既成のチュートリ...

WeChatアプレットがフォーム検証を実装

WeChatアプレットフォームの検証、参考までに具体的な内容は次のとおりです。プラグインWxVali...

MySQL マスタースレーブ遅延問題の解決方法

今日は、マスタースレーブ遅延が発生する理由とその対処方法について説明します。しっかり座って出発の準備...

コンテンツの位置をランダムにドラッグするHTMLを実装する2つの方法

テスト: Chrome v80.0.3987.122 は正常です方法は2つあります。通常のラベルの位...

IE6/7 で絶対配置された要素が不可解に消えたりブロックされたりする問題を解決する方法

1. 絶対配置レイヤーの隣接フローティング レイヤーの幅が親レイヤーの幅と等しくなく、フロートがクリ...

TypeScript 3.7 で注目すべき 3 つの新機能について簡単に説明します。

目次序文オプションの連鎖ヌル結合呼び出されていない関数のチェック他の序文TypeScript 3.7...

Hタグはウェブページ制作において適切に使用すべきである

HTML タグには、ページのタイトルを処理するための特別なタグがあります。これらは h1、h2、h3...

WeChatアプレットのスクロールビューが左右の連動を実現

この記事では、WeChatアプレットのスクロールビューの左右連動を実現するための具体的なコードを参考...

Rx レスポンシブプログラミングについての簡単な説明

目次1. 観察可能2. 高階関数3. エクスプレスボックスモデル3.1. エクスプレスボックスモデル...

React でインデックスをキーとして使用することが推奨されないのはなぜですか?

1. 古い仮想DOMと新しい仮想DOMを比較し、まずキーが同じかどうかを確認します。 2. 引き続...

CSS3でシャトル星空のアニメーションを実現

結果: html <canvas id="スターフィールド"><...