1. 程式人生 > >46.LNMP架構介紹 mysql及PHP-fpm安裝 Nginx介紹

46.LNMP架構介紹 mysql及PHP-fpm安裝 Nginx介紹

12.1 LNMP架構介紹

12.2 MySQL安裝

12.3/12.4 PHP-fpm安裝

12.5 Nginx介紹

擴充套件

Nginx為什麼比Apache Httpd高效:原理篇 http://www.toxingwang.com/linux-unix/linux-basic/1712.html

apache和nginx工作原理比較 http://www.server110.com/nginx/201402/6543.html

mod_php 和 mod_fastcgi以及php-fpm的比較 http://dwz.cn/1lwMSd

概念瞭解:CGI,FastCGI,PHP-CGI與PHP-FPM http://www.nowamagic.net/librarys/veda/detail/1319/ https://www.awaimai.com/371.html

 

 

12.1 LNMP架構介紹:

 

~1.和LAMP不同的是,提供web服務的是Nginx

~2.並且php是作為一個獨立服務存在的,這個服務叫做php-fpm

~3.Nginx直接處理靜態請求,動態請求會轉發給php-fpm

~4.與Apache相比,Nginx在靜態檔案的互動上會比Apache快很多。使用者併發支援會很大,上好幾萬,Apache做不到

 

 

 

12.2 MySQL安裝:

 

 

安裝方法與LAMP裡的mysql方法一樣

~1.cd /usr/local/src

~2.wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.43-linux-glibc2.5-x86_64.tar.gz

~3.tar zxvf mysql-5.6.43-linux-glibc2.5-x86_64.tar.gz

~4.mv mysql-5.6.43-linux-glibc2.5-x86_64 /usr/local/mysql

~5.cd /usr/local/mysql

~6.useradd mysql

~7.mkdir /data/

.~8./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

~9.cp support-files/my-default.cnf /etc/my.cnf 拷貝配置檔案

~10.vi /etc/my.cnf

~11.定義datadir和socket

~12.cp support-files/mysql.server /etc/init.d/mysqld 拷貝啟動指令碼

~13.vi /etc/init.d/mysqld

~14.定義basedir和datadir

~15/etc/init.d/mysqld start

 

我們這裡先把之前安裝的mysql刪除,再重新安裝

[root@axinlinux-01 ~]# cd /usr/local/src 先cd進src

[root@axinlinux-01 src]# ps aux | grep mysql 檢查mysql是否執行

root 1089 0.0 0.0 115432 1704 ? S 19:39 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/axinlinux-01.pid

mysql 1296 3.8 24.2 1302732 453888 ? Sl 19:39 0:05 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=axinlinux-01.err --pid-file=/data/mysql/axinlinux-01.pid

root 1599 0.0 0.0 112720 980 pts/0 S+ 19:41 0:00 grep --color=auto mysql

[root@axinlinux-01 src]# service mysql stop 關閉mysql

Redirecting to /bin/systemctl stop mysql.service

[root@axinlinux-01 src]# ps aux | grep mysql 再次檢查

root 1633 0.0 0.0 112720 980 pts/0 R+ 19:42 0:00 grep --color=auto mysql

[root@axinlinux-01 src]# rm -rf /usr/local/mysql 刪除mysql目錄

[root@axinlinux-01 src]# rm -rf /etc/init.d/mysqld 刪除啟動指令碼

[root@axinlinux-01 src]# vim /etc/my.cnf 系統會自帶一個my.cnf,所以暫且保留

[root@axinlinux-01 src]# tar -xvf mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz 解壓

[root@axinlinux-01 src]# mv mysql-5.6.43-linux-glibc2.12-x86_64 /usr/local/

apache2/ apr-util/ etc/ include/ lib64/ mariadb/ php7/ share/ 看一下有沒有應存在的mysql目錄

apr/ bin/ games/ lib/ libexec/ php/ sbin/ src/

[root@axinlinux-01 src]# mv mysql-5.6.43-linux-glibc2.12-x86_64 /usr/local/mysql 挪到local下,並改名字叫mysql

[root@axinlinux-01 src]# ls /usr/local/mysql/ 看一下是不是這幾個檔案

bin  COPYING  data  docs  include  lib  man  mysql-test  README  scripts  share  sql-bench  support-files

[root@axinlinux-01 mysql]# useradd mysql

[root@axinlinux-01 mysql]# rm -rf /data/mysql/* 因為之前建立過,過意直接刪除mysql目錄下的左右

[root@axinlinux-01 mysql]# id mysql 檢視一下mysql這個使用者

uid=1000(mysql) gid=1000(mysql) 組=1000(mysql)

[root@axinlinux-01 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql 初始化,過程其實就是他啟動所需要的目錄生成

[root@axinlinux-01 mysql]# echo $? 要出現兩個OK,或者echo $?看一下

0

[root@axinlinux-01 mysql]# vim /etc/my.cnf 因為之前拷貝過配置檔案,所以直接vim定義了datadir和socket

basedir =/usr/local/mysql
datadir = /data/mysql

# port = .....

# server_id = .....

socket = /tmp/mysql.sock

[root@axinlinux-01 mysql]# cp support-files/mysql.server /etc/init.d/mysqld 拷貝啟動指令碼

[root@localhost mysql]# ls support-files
binary-configure  magic  my-default.cnf  mysqld_multi.server  mysql-log-rotate  mysql.server
[root@localhost mysql]# ls /etc/init.d/
functions  mysqld  netconsole  network  README

[root@axinlinux-01 mysql]# vim /etc/init.d/mysqld 定義啟動指令碼的basedir和datadir

basedir=/usr/local/mysql

datadir=/data/mysql

[root@axinlinux-01 mysql]# chkconfig --add mysqld 加入到服務裡表裡面去

[root@axinlinux-01 mysql]# chkconfig mysqld on 設定開機啟動

[root@axinlinux-01 mysql]# service mysqld stop 這時候可以用命令關閉

Shutting down MySQL.. SUCCESS!

[root@axinlinux-01 mysql]# service mysqld start 也可以用命令開啟

Starting MySQL. SUCCESS!

[root@axinlinux-01 mysql]# ps aux |grep mysqld 檢查是否用命令開啟

root       1881  0.0  0.1  11816  1632 pts/0    S    10:14   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/localhost.pid
mysql      2032  8.6 45.3 1302744 452028 pts/0  Sl   10:14   0:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=localhost.err --pid-file=/data/mysql/localhost.pid --socket=/tmp/mysql.sock
root       2056  0.0  0.0 112724   988 pts/0    R+   10:14   0:00 grep --color=auto mysqld

 

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

12.3/12.4 PHP安裝:

 

 

和LAMP安裝PHP方法有差別,需要開啟php-fpm服務

~1.cd /usr/local/src/

~2.wget http://cn2.php.net/distributions/php-5.6.32.tar.gz

~3.tar zxf php-5.6.32.tar.gz

~4.useradd -s /sbin/nologin php-fpm

~5.cd php-5.6.32

~6../configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl

~7.make && make install

~8.cp php.ini-production /usr/local/php-fpm/etc/php.ini

php.ini-development給開發用的或測試用的。php.ini-production適合生產環境用

~9.vi /usr/local/php-fpm/etc/php-fpm.conf 寫入如下內容

[global]

pid = /usr/local/php-fpm/var/run/php-fpm.pid

error_log = /usr/local/php-fpm/var/log/php-fpm.log

[www]

listen = /tmp/php-fcgi.sock

#listen = 127.0.0.1:9000 例項中有對這兩者的解釋,選擇一種

listen.mode = 666

user = php-fpm

group = php-fpm

pm = dynamic

pm.max_children = 50

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

pm.max_requests = 500

rlimit_files = 1024

~10.cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

~11.chmod 755 /etc/init.d/php-fpm

~12.chkconfig --add php-fpm

~13.chkconfig php-fpm on

~14.service php-fpm start

~15.ps aux |grep php-fpm

(/usr/local/php-fpm/sbin/php-fpm -m/-i與/usr/local/php-fpm/bin/php -m/-i是一樣的,都可以檢視。但是多了一個 -t

/usr/local/php-fpm/sbin/php-fpm -t是測試他自己配置檔案語法的,makeinstall之後用-t就會提示沒有配置檔案也就是~10.)

 

 

例項:

因為我們之前安裝過,所以直接make clean 清空之前的配置,回到剛解壓的狀態

[root@axinlinux-01 php]# cd /usr/local/src/php-5.6.32/ 進入解壓後的php5

[root@axinlinux-01 php-5.6.32]# make clean 清空之前的配置,回到剛解壓的狀態

find . -name \*.gcno -o -name \*.gcda | xargs rm -f
find . -name \*.lo -o -name \*.o | xargs rm -f
find . -name \*.la -o -name \*.a | xargs rm -f 
find . -name \*.so | xargs rm -f
find . -name .libs -a -type d|xargs rm -rf
rm -f libphp5.la sapi/cli/php sapi/cgi/php-cgi    libphp5.la modules/* libs/*

[root@axinlinux-01 php-5.6.32]# ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl

在這裡我們把php的名字設定成了--prefix=php-fpm(和Nginx對應的)

還有他的配置檔案也改成和Nginx對應的--with-config-file-path=/usr/local/php-fpm/etc

注意要加上--enable-fpm,啟動php-fpm,不加就沒法啟動這個服務。(在Nginx中php作為服務存在的)

--with-fpm-user=php-fpm指定使用者

--with-fpm-group=php-fpm指定組

--with-mysql=/usr/local/mysql 指定路徑

報錯configure: error: Please reinstall the libcurl distribution

yum install curl curl-devel
Thank you for using PHP.

config.status: creating php5.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands

[root@axinlinux-01 php-5.6.32]# echo $?

0

[root@axinlinux-01 php-5.6.32]# make

Generating phar.php
Generating phar.phar
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
clicommand.inc
directorytreeiterator.inc
invertedregexiterator.inc
directorygraphiterator.inc
pharcommand.inc
phar.inc

[root@axinlinux-01 php-5.6.32]# echo $?

0

[root@axinlinux-01 php-5.6.32]# make install

Installing shared extensions:     /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
Installing PHP CLI binary:        /usr/local/php-fpm/bin/
Installing PHP CLI man page:      /usr/local/php-fpm/php/man/man1/
Installing PHP FPM binary:        /usr/local/php-fpm/sbin/
Installing PHP FPM config:        /usr/local/php-fpm/etc/
Installing PHP FPM man page:      /usr/local/php-fpm/php/man/man8/
Installing PHP FPM status page:   /usr/local/php-fpm/php/php/fpm/
Installing PHP CGI binary:        /usr/local/php-fpm/bin/
Installing PHP CGI man page:      /usr/local/php-fpm/php/man/man1/
Installing build environment:     /usr/local/php-fpm/lib/php/build/
Installing header files:           /usr/local/php-fpm/include/php/
Installing helper programs:       /usr/local/php-fpm/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php-fpm/php/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr/local/php-fpm/lib/php/
[PEAR] Archive_Tar    - installed: 1.4.3
[PEAR] Console_Getopt - installed: 1.4.1
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util       - installed: 1.4.2
[PEAR] PEAR           - installed: 1.10.5
Wrote PEAR system config file at: /usr/local/php-fpm/etc/pear.conf
You may want to add: /usr/local/php-fpm/lib/php to your php.ini include_path
/usr/local/src/php-5.6.32/build/shtool install -c ext/phar/phar.phar /usr/local/php-fpm/bin
ln -s -f phar.phar /usr/local/php-fpm/bin/phar
Installing PDO headers:           /usr/local/php-fpm/include/php/ext/pdo/

[root@axinlinux-01 php-5.6.32]# echo $?

0

[root@axinlinux-01 php-5.6.32]# /usr/local/php-fpm/sbin/php-fpm -t 自帶的-t測試,提示沒有配置檔案

[23-Jul-2019 10:43:22] ERROR: failed to open configuration file '/usr/local/php-fpm/etc/php-fpm.conf': No such file or directory (2)
[23-Jul-2019 10:43:22] ERROR: failed to load configuration file '/usr/local/php-fpm/etc/php-fpm.conf'
[23-Jul-2019 10:43:22] ERROR: FPM initialization failed

[root@axinlinux-01 php-5.6.32]# cp php.ini-production /usr/local/php-fpm/etc/php.ini 拷貝配置檔案,這裡選php.ini-production生產環境用的

[root@axinlinux-01 php-5.6.32]# vi /usr/local/php-fpm/etc/php-fpm.conf

[global] 定義全域性的引數

pid = /usr/local/php-fpm/var/run/php-fpm.pid

error_log = /usr/local/php-fpm/var/log/php-fpm.log

[www] 模組的名字,啟動的時候就會看到

listen = /tmp/php-fcgi.sock 監聽的地址。php-fpm可以監聽socket可以監聽tcp/ip,這裡可以寫socket也可以寫下面的

#listen = 127.0.0.1:9000 一般都是監聽這個IP。因為php-fpm是在內部使用的,在本機上用的,也就是Nginx和php通常是在一臺機器上的。他們兩者通訊就可以用內部的網路。當然也可以監聽其他的IP。prot預設是9000,也可以改成其他的

以上是兩種不同的監聽方法。這選擇不同的話,後面php-fpm與nginx結合的時候,配置語句也是不同的

listen.mode = 666 socket的時候這個語句才會生效。就是上面選socket的時候定義它的許可權

user = php-fpm 定義使用者和組。誰啟動的

group = php-fpm

pm = dynamic 一下是關於程序的資訊。後面會講

pm.max_children = 50

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

pm.max_requests = 500

rlimit_files = 1024

[global] 
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www] 
listen = /tmp/php-fcgi.sock 
#listen = 127.0.0.1:9000 
listen.mode = 666 
user = php-fpm 
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

[root@axinlinux-01 php-5.6.32]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm 拷貝啟動指令碼

[root@axinlinux-01 php-5.6.32]# chmod 755 /etc/init.d/php-fpm

[root@axinlinux-01 php-5.6.32]# chkconfig --add php-fpm

[root@axinlinux-01 php-5.6.32]# chkconfig php-fpm on

[root@axinlinux-01 php-5.6.32]# service php-fpm start 執行到這一步有報錯。是之前忘記建立使用者

Starting php-fpm [23-Jul-2019 11:02:39] ERROR: [pool www] cannot get uid for user 'php-fpm'
[23-Jul-2019 11:02:39] ERROR: FPM initialization failed
 failed

[root@axinlinux-01 php-5.6.32]# useradd php-fpm 建立php-fpm使用者。不要忘記

[root@axinlinux-01 php-5.6.32]# /usr/local/php-fpm/sbin/php-fpm -t 檢測成功

[23-Jul-2019 11:04:08] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

 

[root@axinlinux-01 php-5.6.32]# service php-fpm start 開啟php-fpm

Starting php-fpm done

[root@axinlinux-01 php-5.6.32]# ps aux |grep php-fpm

root     119564  0.0  0.4 125928  4952 ?        Ss   11:04   0:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf)
php-fpm  119565  0.0  0.4 125928  4708 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119566  0.0  0.4 125928  4708 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119567  0.0  0.4 125928  4708 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119568  0.0  0.4 125928  4708 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119569  0.0  0.4 125928  4712 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119570  0.0  0.4 125928  4712 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119571  0.0  0.4 125928  4712 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119572  0.0  0.4 125928  4712 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119573  0.0  0.4 125928  4712 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119574  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119575  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119576  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119577  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119578  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119579  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119580  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119581  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119582  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119583  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
php-fpm  119584  0.0  0.4 125928  4716 ?        S    11:04   0:00 php-fpm: pool www
root     119586  0.0  0.0 112724   992 pts/0    R+   11:05   0:00 grep --color=auto php-fpm

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

12.5 Nginx介紹:

 

 

 

~1.Nginx官網 nginx.org,最新版1.13,最新穩定版(stable)1.12 (俄國人開發的)。他的靜態檔案處理能力比Apache強很多。儘量去選擇最新的穩定版本(stable)。有些會另外安一個nginx來處理靜態檔案,比如,tomcat+nginx的Java應用

~2.小巧,功能也非常的強大。本身可能支援的功能不是很多,但是可擴充套件第三方的模組進來。比如支援https功能就要安裝模組。模組跟Apache都是很類似的,因為框架結構都是一樣的

~3. Nginx應用場景:web服務、反向代理(代理一臺就叫反向代理)、負載均衡(代理兩臺就叫負載均衡)

~4.Nginx著名分支,淘寶(圖片居多)基於Nginx開發的Tengine,使用上和Nginx一致,服務名,配置檔名都一樣,和Nginx的最大區別在於Tenging增加了一些定製化模組,在安全限速方面表現突出,另外它支援對js,css合併

像淘寶,頁面圖片很多,訪問進去的話,一個頁面請求就會很多。所以淘寶就想到吧這些小的js、css圖片合併起來,一個請求就把他們處理完了。最終就搞了一個Tenging

~5. Nginx核心+lua(一種開發語言)相關的元件和模組組成了一個支援lua的高效能web容器openresty,參考http://jinnianshilongnian.iteye.com/blog/2280928(作為擴充套