LNMP環境搭建(PHP7.2.25)
目錄
- 準備工作
- 安裝wget
- 安裝net-tools
- 安裝vim
- 配置顯示行號
- 關閉防火牆
- 安裝Nginx
- 安裝依賴
- 編譯安裝Nginx
- 配置環境變數
- Systemd管理
- 安裝MySQL
- 安裝依賴
- 下載boost
- 編譯安裝MySQL
- 配置環境變數
- 修改配置檔案
- Systemd管理
- 登入MySQL
- 安裝PHP
- 安裝依賴
- 編譯安裝PHP
- 配置Systemd服務
- 關聯Nginx和PHP
- 安裝Redis
- 編譯安裝
- 配置環境變數
- 配置後臺執行
- 配置Systemd服務
- 參考資料
作為一名PHP開發者,我們一定要懂得如何搭建PHP開發環境,目前主流的PHP開發環境組合是LAMP和LNMP,本文將介紹如何在CentOS7.*上搭建LNMP開發環境。
各項版本說明:
CentOS7: 7.7
Nginx: 1.16.1
MySQL:5.7.28
PHP:7.2.25
安裝所需所有的資源我都放在了/usr/local/src目錄下
準備工作
安裝wget
wget
是一個從網路上自動下載檔案的自由工具,支援通過 HTTP、HTTPS、FTP 三個最常見的TCP/IP協議下載,並可以可以使用HTTP代理。
sudo yum -y install wget
安裝net-tools
最小化安裝CentOS7時如果無法使用ifconfig命令,則需要安裝net-tools
,如果是安裝的CentOS6版本則無需安裝
sudo yum -y install net-tools
安裝vim
sudo yum -y install vim
配置顯示行號
vim ~/.vimrc # 編輯.vimrc配置檔案
set nu # 輸入set nu 後退出儲存
關閉防火牆
systemctl stop firewalld.service #令關閉防火牆
systemctl disable firewalld.service #關閉防火牆開機自啟動
通過瀏覽器輸入IP測試是否成功
安裝Nginx
安裝依賴
(1) 安裝 nginx
需要先將官網下載的原始碼進行編譯,編譯依賴 gcc 環境,如果沒有 gcc 環境,則需要安裝gcc-c++。
yum -y install gcc gcc-c++
(2) PCRE
是一個Perl庫,中文"Perl相容的正則表示式庫"。安裝Nginx是為了使Nginx支援具備URI重寫功能的rewrite模組,如果不安裝pcre庫,則Nginx無法使用rewrite模組功能,Nginx的Rewrite模組功能幾乎是企業應用必須。
yum -y install pcre pcre-devel
(3) zlib
庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,所以需要在 Centos 上安裝 zlib 庫。
yum -y install zlib zlib-devel
(4) OpenSSL
是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的金鑰和證書封裝管理功能及 SSL 協議,並提供豐富的應用程式供測試或其它目的使用。 nginx 不僅支援 http 協議,還支援 https(即在ssl協議上傳輸http),所以需要安裝 OpenSSL 庫 。
yum -y install openssl openssl-devel
說明: yum安裝方式安裝的pcre版本比較低,不過基本不影響使用,但是最好還是手動編譯安裝官網最新穩定版的openssl。
檢查基礎依賴包
上面的依賴安裝完成後可以通過如下命令檢查各個依賴安裝是否成功
rpm -qa pcre pcre-devel
rpm -qa zlib zlib-devel
rpm -qa pcre pcre-devel
編譯安裝Nginx
# 這裡我們把安裝包都放到了/usr/local/src目錄下,便於統一管理
cd /usr/local/src #切換到軟體包目錄
wget http://nginx.org/download/nginx-1.16.1.tar.gz #下載nginx原始碼包
useradd nginx -s /sbin/nologin -M #建立nginx使用者用於管理nginx程式
tar -zxvf nginx-1.16.1.tar.gz #解壓nginx原始碼包
cd nginx-1.16.1
#預編譯
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx-1.16.1 \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_stub_status_module
make && make install #編譯 和 安裝
cd /usr/local
ln -s nginx-1.16.1 nginx #建立nginx的軟連結
安裝說明
--prefix=PATH #設定安裝路勁
--user=USER #程序使用者許可權
--group=GROUP #程序使用者組許可權
--with-http_v2_module # HTTP2
--with-http_stub_status_module #啟用狀態資訊
--with-http_ssl_module #啟用ssl功能
配置環境變數
vim /etc/profile
export PATH=/usr/local/nginx/sbin:$PATH
source /etc/profile
Systemd管理
新建並編輯/usr/lib/systemd/system/nginx.service
檔案
vim /usr/lib/systemd/system/nginx.service
並新增如下內容(這裡的配置是根據自己安裝Nginx的路徑來配置的,Nginx安裝在了/usr/local
目錄下)
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
通過yum安裝的nginx,預設的nginx.service配置如下,可以作為參考
# /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
過載daemon
執行下面的命令重新載入 systemd,掃描新的或有變動的單元即可
systemctl daemon-reload
設定開機自啟
systemctl enable nginx.service # 設定開機自啟
systemctl disable nginx.service # 取消開機自啟服務
Nginx服務管理常用命令
systemctl status nginx.service # 檢視Nginx狀態
systemctl start nginx.service # 開啟Nginx
systemctl stop nginx.service # 關閉Nginx
systemctl reload nginx.service # 過載配置
systemctl restart nginx.service # 重啟Nginx(相當於stop&start)
服務啟動檢查
可以通過該命令查詢80埠被誰佔用
lsof -i :80
如果無法識別該命令,需要安裝lsof
sudo yum -y install lsof
安裝MySQL
安裝依賴
(1)cmake是新版MySQL的編譯工具,必須安裝
sudo yum -y install gcc gcc-c++ cmake ncurses-devel perl perl-devel autoconf bison bison-devel libtirpc libtirpc-devel
下載boost
如果安裝的MySQL5.7及以上的版本,在編譯安裝之前需要安裝boost,因為高版本mysql需要boots庫的安裝才可以正常執行。否則會報CMake Error at cmake/boost.cmake:81
錯誤
切換到/usr/local/src
目錄,然後在這個目錄下下載boost
MySQL5.7.27要求boost的版本是1.59,更高版本的不適用MySQL5.7.28
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
百度網盤連結: boost_1_59_0.tar.gz
編譯安裝MySQL
# 新增MySQL使用者
useradd -s /sbin/nologin -M mysql
# 切換到/usr/src目錄
cd /usr/local/src
# 下載MySQL
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28.tar.gz
# 解壓MySQL
tar -zxvf mysql-5.7.28.tar.gz
#解壓boost,並移至mysql/boost
tar -zxvf boost_1_59_0.tar.gz
mv boost_1_59_0 mysql-5.7.28/boost
# 進到MySQL目錄
cd mysql-5.7.28
# 預編譯
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.28 \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 \
-DWITH_SSL=system \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_DATADIR=/var/lib/mysql/data \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_INNODB_MEMCACHED=1 \
-DWITH_DEBUG=OFF \
-DWITH_ZLIB=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DENABLED_PROFILING=ON \
-DMYSQL_MAINTAINER_MODE=OFF \
-DMYSQL_TCP_PORT=3306
# 編譯&安裝
make && make install
# 建立軟連結
cd /usr/local
ln -s mysql-5.7.28 mysql
配置環境變數
# 新增到環境變數
vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile
修改配置檔案
在
/var/lib
目錄下建立一個mysql
資料夾mkdir -p /var/lib/{mysql,mysql/data} touch /var/lib/mysql/mysqld.pid chown mysql.mysql -R /var/lib/mysql/
修改
/etc/my.cnf
檔案# 修改/etc/my.cnf檔案,編輯配置檔案如下 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci datadir=/var/lib/mysql/data socket=/var/lib/mysql/mysql.sock [mysqld_safe] log-error=/var/log/mysql/mysqld.log pid-file=/var/lib/mysql/mysqld.pid [client] default-character-set=utf8mb4
建立
mysqld.log
和mysqld.pid
檔案,並修改檔案許可權# 建立mysqld.log 和 mysqld.pid檔案 mkdir /var/log/mysql touch /var/log/mysql/mysqld.log chown mysql.mysql -R /var/log/mysql/
初始化資料庫
# 初始化資料庫, –initialize 表示預設生成一個安全的密碼,–initialize-insecure 表示不生成密碼 mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql/data
Systemd管理
建立一個/usr/lib/systemd/system/mysqld.service
檔案,然後編輯內容如下
vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/var/lib/mysql/mysqld.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Needed to create system tables
ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd
# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/lib/mysql/mysqld.pid $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=/etc/my.cnf
# Sets open_files_limit
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=true
過載daemon
執行下面的命令重新載入 systemd,掃描新的或有變動的單元即可
systemctl daemon-reload
啟動MySQL
systemctl start mysqld.service # 啟動MySQL
systemctl stop mysqld.service # 關閉MySQL
systemctl status mysqld.service # 檢視MySQL狀態
開機自啟
systemctl enable mysqld.service # 設定開機自啟
systemctl disable mysqld.service # 取消開機自啟
登入MySQL
mysql -u root -p #第一次登陸不需要密碼,回車即可
set password for root@localhost = password('root'); #修改密碼
安裝PHP
安裝依賴
sudo yum -y install gcc gcc-c++ zip unzip libxml2 libxml2-devel curl-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel gd-devel bzip2 bzip2-devel libzip libzip-devel libwebp libwebp-devel
編譯安裝PHP
cd /usr/local/src
tar -zxvf php-7.2.25.tar.gz
cd php-7.2.25
./configure \
--prefix=/usr/local/php-7.2.25 \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-mysql-sock=/var/lib/mysql/mysql.sock \
--with-gd \
--with-webp-dir \
--with-png-dir \
--with-gettext \
--with-jpeg-dir \
--with-freetype-dir \
--with-iconv-dir \
--with-zlib-dir \
--with-bz2 \
--with-openssl \
--with-curl \
--enable-mbstring \
--enable-static \
--enable-zip \
--enable-bcmath \
--enable-ftp \
--enable-pcntl \
--enable-soap \
--enable-calendar \
--enable-sockets \
--enable-exif \
--enable-xml
make && make install
編譯引數詳解
./configure \
--prefix=/usr/local/php-7.2.25 \ # 指定安裝路徑
--enable-fpm \ # 表示啟用PHP-FPM方式服務,即FactCGI方式執行PHP服務。
--with-fpm-user=nginx \ # 指定PHP-FPM程序管理的使用者為nginx,此處最好和Nginx服務使用者統一。
--with-fpm-group=nginx \ # 指定PHP-FPM程序管理使用者組為nginx,此處最好和Nginx服務使用者組統一。
--enable-mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-mysql-sock=/var/lib/mysql/mysql.sock \
--with-gd \ # 開啟gd庫的支援
--with-webp-dir \
--with-png-dir \
--with-gettext \ # 實現了NLS (Native Language Support) API,他可以用來國際化您的PHP程式
--with-jpeg-dir \
--with-freetype-dir \
--with-iconv-dir \ # 包含了 iconv 字符集轉換功能的介面。
--with-zlib-dir \ # 開啟zlib庫的支援,用於http壓縮傳輸
--with-bz2 \ # 用於透明地讀寫 bzip2(.bz2)壓縮檔案。
--with-openssl \ # 開啟openssl,加密傳輸時用到
--with-curl \ # 開啟curl瀏覽工具的支援
--enable-mbstring \ # 多位元組,字串的支援
--enable-static \ # 生成靜態連結庫
--enable-zip \ # 開啟對zip的支援
--enable-bcmath \
--enable-ftp \ # 通過檔案傳輸協議 (FTP) 提供對檔案伺服器的客戶端訪問
--enable-pcntl \ # 多程序
--enable-soap \
--enable-calendar \
--enable-sockets \ # 開啟 sockets 支援
--enable-exif \ # 可交換影象資訊
--enable-xml
配置
cd /usr/local
ln -s php-7.2.25 php
cp /usr/local/src/php-7.2.25/php.ini-development /usr/local/php-7.2.25/lib/php.ini
vim /usr/local/php/lib/php.ini
date.timezone = PRC (大約在934行)
expose_php = Off #避免PHP資訊暴露在http頭中(大約369行)
display_errors = Off(生產環境設定為off,開發環境就設定為On,便於除錯)
說明:設定了dispaly_errors為off後,需要在php-fpm.conf中開啟錯誤日誌記錄路徑error_log = log/php-fpm.log
cd /usr/local/php
cp etc/php-fpm.conf.default etc/php-fpm.conf
cd /usr/local/php/etc/php-fpm.d/
cp www.conf.default www.conf
cd /usr/local/php
sbin/php-fpm
ps -e | grep php-fpm
如果在編譯PHP時指定了--with-mysql=mysqlnd和--with-pdo-mysql=mysqlnd的引數,那麼在生產中可能會遇到socket連線問題,解決辦法是在php.ini里加入命令: pdo_mysql.default_socket=/var/lib/mysql/mysql.sock
最好是在編譯PHP的時候,指定mysql.socket的位置:
--with-mysql-sock=/var/lib/mysql/mysql.sock
管理PHP-FPM
vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
error_log = log/php-fpm.log #24行這個在php.ini設定display_errors = Off時啟用
設定完之後重啟伺服器
向程序傳送訊號,就可以完成程序管理
停止: kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
平滑停止: kill -QUIT `cat /usr/local/php/var/run/php-fpm.pid`
重啟:kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
重新開啟日誌:kill -USR1 `cat /usr/local/php/var/run/php-fpm.pid`
配置環境變數
vim /etc/profile
export PATH=/usr/local/php/bin:$PATH
source /etc/profile
配置Systemd服務
其實php-fpm.service檔案php已經幫我們配置好了,只需要我們複製到指定位置,並啟用就行了。
cp /usr/local/src/php-7.2.25/sapi/fpm/php-fpm.service /usr/lib/systemd/system/
編輯/usr/lib/systemd/system/php-fpm.service
檔案並修改為如下內容:
# It's not recommended to modify this file in-place, because it
# will be overwritten during upgrades. If you want to customize,
# the best way is to use the "systemctl edit" command.
[Unit]
Description=The PHP FastCGI Process Manager
After=network.target
[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
過載daemon
執行下面的命令重新載入 systemd,掃描新的或有變動的單元即可
systemctl daemon-reload
開機自啟
systemctl enable php-fpm.service
啟動php-fpm
systemctl start php-fpm.service
關聯Nginx和PHP
nginx.conf配置
#user nobody;
# 有一個工作的子程序,可以自行修改,但太大無益,因為要爭奪CPU
# 一般設定CPU數 * 核數
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
#一般是配置Nginx程序與連線的特性
#若幾個同時工作
multi_accept on; #開啟同時接受多個新網路連線請求的功能。
use epoll; #使用epoll事件驅動,因為epoll的效能相比其他事件驅動要好很多
worker_connections 10240; #這是指一個子程序最大允許連線10240個連線
}
http { # 這是配置http伺服器的主要段
include mime.types;
default_type application/octet-stream;
#隱藏Nginx軟體版本號
server_tokens off;
#啟用tcp_nodelay功能,提高I/O效能
tcp_nodelay on;
# 設定讀取客戶端請求頭資料的超時時間。此處的數值為15,其單位是秒,為經驗參考值
client_header_timeout 15;
# 設定讀取客戶端請求體的超時時間
client_body_timeout 15;
# 指定響應客戶端的超時時間
send_timeout 25;
# 上傳檔案大小限制
client_max_body_size 8m;
#壓縮配置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain text/css text/xml application/javascript;
gzip_vary on;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#include extra/*.conf;
server {
listen 80;
server_name www.blog.com;
root html;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
}
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
}
安裝Redis
編譯安裝
# 解壓原始碼檔案
tar -zxvf redis-5.0.7.tar.gz
# 切換到解壓目錄
cd redis-5.0.7
# 編譯安裝
make PREFIX=/usr/local/redis-5.0.7 install
mkdir /usr/local/redis-5.0.7/etc
cp redis.conf /usr/local/redis-5.0.7/etc/
# 建立軟連結
cd /usr/local
ln -s redis-5.0.7 redis
配置環境變數
vim /etc/profile
export PATH=/usr/local/redis/bin:$PATH
source /etc/profile # 使修改立即生效
配置後臺執行
讓redis
以後臺程序的形式執行
vim /usr/local/redis/etc/redis.conf
# daeonize no(大約136行)
# 改為 ->
daemonize yes
配置Systemd服務
在 /usr/lib/systemd/system/
新增一個redis.service
檔案,並新增如下內容
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
過載daemon
執行下面的命令重新載入 systemd,掃描新的或有變動的單元即可
systemctl daemon-reload
開機自啟
systemctl enable redis.service
啟動redis服務
systemctl start redis.service
參考資料
centos7 原始碼編譯安裝 mysql5.7
mysql在linux7下systemd的相關配置
Managing MySQL Server with systemd
centos7 7.3php編譯安裝
centos7下編譯安裝php7.3
cmake安裝配置及入門指南
編譯CMake 3.15 和 gcc 5.3.0
CentOS7升級OpenSSL到1