8.10 12.1-12.5
Apache與nginx的功能類似
在LNMP架構中,PHP會作為一個獨立的服務存在,這個服務叫php-fpm,nginx會將用戶請求的php交個php-fpm處理
php-fpm會和mysql進行交互
用戶登錄網站時需要將用戶的身份信息(用戶名密碼)與mysql中的信息進行比對查找,該工作由php-fpm完成,若查證無誤,則php-fpm會返回信息給nginx,再由nginx告訴用戶的瀏覽器
靜態請求會由nginx直接處理,nginx處理靜態請求的性能比apache更好
Nginx可以支持較大的用戶並發數
12.2 MySQL安裝
重新安裝mysql:
刪除原來的mysql:
1 檢查原來安裝的mysql是否運行
[root@hyc-01-01 ~]# ps aux|grep mysql
root 1023 0.0 0.0 112720 984 pts/0 R+ 20:49 0:00 grep --color=auto mysql 未運行
2 刪除mysql相關文件
[root@hyc-01-01 local]# rm -rf /usr/local/mysql 刪除mysql包解壓後的目錄
[root@hyc-01-01 local]# rm -rf /etc/init.d/mysqld 刪除mysql啟動腳本
3 下載mysql包
將所有包下載至統一路徑下
[root@hyc-01-01 src]# wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
4 將解壓後的包移動位置並改名為mysql
[root@hyc-01-01 src]# mv mysql-5.6.39-linux-glibc2.12-x86_64 /usr/local/mysql
此時/usr/local/路徑下一定不能存在mysql目錄,否則會將文件移動到這個mysql目錄下並且不會修改文件名稱
5 檢查/usr/local路徑下的mysql目錄並進入該目錄,創建/data目錄及mysql用戶
[root@hyc-01-01 src]# ls /usr/local/mysql/
bin data include man README share support-files
COPYING docs lib mysql-test scripts sql-bench
[root@hyc-01-01 src]# cd /usr/local/mysql
[root@hyc-01-01 mysql]# ls /data /data目錄已創建
mariadb mysql wwwroot
[root@hyc-01-01 mysql]# id mysql mysql用戶已創建
uid=1002(mysql) gid=1002(mysql) 組=1002(mysql)
6 清空目錄/data/mysql或直接刪除/data/mysql目錄
[root@hyc-01-01 mysql]# rm -rf /data/mysql/*
僅刪除/data/mysql/目錄下的文件,不刪除mysql目錄本身
也可以將整個mysql目錄刪除
7 初始化
生成mysql啟動所需的目錄的過程
[root@hyc-01-01 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
安裝過程中出現2個ok則說明正確執行
[root@hyc-01-01 mysql]# echo $? 檢查是否正確執行(需要執行完成後立即執行該命令檢查)
0 為0則執行無誤
8 配置mysql配置文件(my.cnf)
拷貝配置文件到/etc下(若/etc下已有my.cnf則不執行該步)
[root@hyc-01-01 mysql]# cp support-files/my-default.cnf /etc/my.cnf
mysqld服務查找配置文件時默認會到/etc目錄下查找文件名為my.cnf的文件,所以需要將配置文件名改為my.cnf並移動文件到/etc下
檢查配置:
[root@hyc-01-01 etc]# vim my.cnf
1 [mysqld]
2 federated
3 datadir=/data/mysql datadir路徑是否正確
4 socket=/tmp/mysql.sock socket路徑是否正確
…
9 拷貝啟動腳本並編輯
拷貝:
[root@hyc-01-01 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
編輯:
[root@hyc-01-01 mysql]# vim /etc/init.d/mysqld
…
42
43 # If you change base dir, you must also change datadir. These may get
44 # overwritten by settings in the MySQL configuration files.
45
46 basedir=/usr/local/mysql
47 datadir=/data/mysql
48
…
10 啟動mysqld
[root@hyc-01-01 mysql]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/hyc-01-01.err'.
. SUCCESS! 啟動成功
檢查:
[root@hyc-01-01 mysql]# ps aux|grep mysqld
root 1327 0.0 0.1 113308 1604 pts/0 S 22:11 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/hyc-01-01.pid
mysql 1477 1.6 44.6 1302724 449788 pts/0 Sl 22:11 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=hyc-01-01.err --pid-file=/data/mysql/hyc-01-01.pid --socket=/tmp/mysql.sock
root 1503 0.0 0.0 112720 980 pts/0 R+ 22:12 0:00 grep --color=auto mysqld
將mysqld加入服務列表
[root@hyc-01-01 mysql]# chkconfig --add mysqld 將mysqld加入服務列表
[root@hyc-01-01 mysql]# chkconfig mysqld on 設置開機啟動
此時可以使用以下命令:
[root@hyc-01-01 mysql]# service mysqld stop
Shutting down MySQL.. SUCCESS!
[root@hyc-01-01 mysql]# service mysqld start
Starting MySQL. SUCCESS!
[root@hyc-01-01 mysql]# ps aux|grep mysqld
root 1584 0.0 0.1 11816 1600 pts/0 S 22:15 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/hyc-01-01.pid
mysql 1735 1.1 44.6 1302724 449776 pts/0 Sl 22:15 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=hyc-01-01.err --pid-file=/data/mysql/hyc-01-01.pid --socket=/tmp/mysql.sock
root 1759 0.0 0.0 112720 980 pts/0 R+ 22:16 0:00 grep --color=auto mysqld
12.3 PHP安裝(上)
LAMP和LNMP的PHP安裝不一樣:
安裝LAMP時,由於PHP是apache的一個模塊,所以需要在安裝時指定apache的路徑,需要使用apxs工具自動配置模塊
LNMP的PHP在配置時仍需要MySQL
在nginx下使用時PHP作為一個獨立的服務存在,與nginx無直接關系
操作:
1 進入PHP源碼包文件
[root@hyc-01-01 src]# cd php-5.6.30
[root@hyc-01-01 php-5.6.30]# pwd
/usr/local/src/php-5.6.30
2 刪除原先安裝LAMP時編譯的文件
[root@hyc-01-01 php-5.6.30]# 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/*
執行完成後的/usr/local/src/php-5.6.30就是一個剛被解壓時的狀態
3 生成可編譯文件
為了與php5及php7區分,指定安裝路徑為/usr/local/php-fpm
[root@hyc-01-01 php-5.6.30]# ./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
編譯的參數大部分與apache相同
不同:
--prefix=/usr/local/php-fpm
--with-config-file-path=/usr/local/php-fpm/etc
--enable-fpm 必須加,不加則服務無法啟動
--with-fpm-user=php-fpm 指定php-fpm的用戶
--with-fpm-group=php-fpm 指定php-fpm的組
報錯:
1
checking for cURL in default path... not found
configure: error: Please reinstall the libcurl distribution -
easy.h should be in <curl-dir>/include/curl/
解決:
[root@hyc-01-01 php-5.6.30]# yum install -y libcurl-devel
4 編譯
[root@hyc-01-01 php-5.6.30]# make
5 安裝
[root@hyc-01-01 php-5.6.30]# make install
12.4 PHP安裝(下)
[root@hyc-01-01 php-5.6.30]# ls /usr/local/php-fpm
bin etc include lib php sbin var
[root@hyc-01-01 php-5.6.30]# ls /usr/local/php
bin etc include lib php
[root@hyc-01-01 php-5.6.30]# ls /usr/local/php-fpm/sbin
php-fpm
[root@hyc-01-01 php-5.6.30]# ls /usr/local/php-fpm/var/
log run
sbin和var是php-fpm中比php多的兩個目錄
在sbin目錄下有php-fpm文件,該文件用於啟動php-fpm服務
var目錄下有log和run目錄,log用於存放日誌,run用於存放pid
日誌和pid的存放路徑均可以單獨指定
sbin下的php-fpm
查看php-fpm包含的模塊:
[root@hyc-01-01 php-5.6.30]# /usr/local/php-fpm/sbin/php-fpm –m
查看php-fpm服務信息:
[root@hyc-01-01 php-5.6.30]# /usr/local/php-fpm/sbin/php-fpm –i
檢查php-fpm配置文件的錯誤:
[12-Aug-2018 12:17:58] ERROR: failed to open configuration file '/usr/local/php-fpm/etc/php-fpm.conf': No such file or directory (2) /usr/local/php-fpm/etc/php-fpm.conf配置文件不存在
[12-Aug-2018 12:17:58] ERROR: failed to load configuration file '/usr/local/php-fpm/etc/php-fpm.conf'
[12-Aug-2018 12:17:58] ERROR: FPM initialization failed
配置php-fpm服務
拷貝php的模板配置文件到指定的php-fpm配置文件路徑下:
[root@hyc-01-01 php-5.6.30]# cp php.ini-production /usr/local/php-fpm/etc/php.ini
php.ini-production:生產環境下使用,在錯誤日誌等處與development不同
php.ini-development:測試環境下使用
編輯php-fpm的配置文件:
[root@hyc-01-01 etc]# pwd
/usr/local/php-fpm/etc
[root@hyc-01-01 etc]# ls
pear.conf php-fpm.conf.default php.ini
新建一個php-fpm.conf文件或直接將php-fpm.conf.default文件改名為php-fpm.conf:
[root@hyc-01-01 etc]# vim php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid 指定pid文件路徑
error_log = /usr/local/php-fpm/var/log/php-fpm.log 錯誤日誌路徑
[www] 模塊名稱
listen = /tmp/php-fcgi.sock 監聽的socket地址
#listen = 127.0.0.1:9000
監聽的ip地址及端口,由於php-fpm通常針對內部使用,在本機器上使用(nginx和php通常在一臺機器上)
php-fpm默認監聽的端口為9000
以上兩個listen為兩種不同的監聽方法
采用不同的監聽方法,在配置nginx和php結合時的配置也會不同,配置結合時需要告訴nginx在×××php,此時配置語句會不一樣
listen.mode = 666 當監聽的是socket地址時生效,用於定義socket文件的權限
user = php-fpm 以下2個用於定義服務的用戶和組
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@hyc-01-01 php-5.6.30]# cd /usr/local/src/php-5.6.30 進入源碼包目錄
[root@hyc-01-01 php-5.6.30]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm 拷貝php啟動腳本並改名
修改啟動腳本權限:
[root@hyc-01-01 php-5.6.30]# chmod 755 /etc/init.d/php-fpm
將php-fpm服務加入服務列表:
[root@hyc-01-01 php-5.6.30]# chkconfig --add php-fpm
將php-fpm設為開機啟動:
[root@hyc-01-01 php-5.6.30]# chkconfig php-fpm on
啟動php-fpm服務:
[root@hyc-01-01 php-5.6.30]# /usr/local/php-fpm/sbin/php-fpm –t 檢測配置錯誤
[12-Aug-2018 13:21:30] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful
[root@hyc-01-01 php-5.6.30]# service php-fpm start
報錯:
Starting php-fpm [12-Aug-2018 13:20:29] ERROR: [pool www] cannot get uid for user 'php-fpm'
[12-Aug-2018 13:20:29] ERROR: FPM initialization failed
failed 啟動失敗
原因:未添加用戶php-fpm
[root@hyc-01-01 php-5.6.30]# useradd php-fpm
[root@hyc-01-01 php-5.6.30]# service php-fpm start
starting php-fpm done 正常啟動
查看進程:
[root@hyc-01-01 php-5.6.30]# ps aux|grep php-fpm
root 54263 0.0 0.4 123648 4948 ? Ss 13:24 0:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf)
php-fpm 54264 0.0 0.4 123648 4700 ? S 13:24 0:00 php-fpm: pool www
pool www:即定義的池的名稱
php-fpm:用戶名
php-fpm 54265 0.0 0.4 123648 4700 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54266 0.0 0.4 123648 4700 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54267 0.0 0.4 123648 4700 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54268 0.0 0.4 123648 4704 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54269 0.0 0.4 123648 4704 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54270 0.0 0.4 123648 4704 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54271 0.0 0.4 123648 4704 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54272 0.0 0.4 123648 4704 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54273 0.0 0.4 123648 4704 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54274 0.0 0.4 123648 4704 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54275 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54276 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54277 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54278 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54279 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54280 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54281 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54282 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
php-fpm 54283 0.0 0.4 123648 4708 ? S 13:24 0:00 php-fpm: pool www
root 54285 0.0 0.0 112720 984 pts/1 R+ 13:26 0:00 grep --color=auto php-fpm
[root@hyc-01-01 php-5.6.30]# ls -l /tmp/php-fcgi.sock
srw-rw-rw- 1 root root 0 8月 12 13:24 /tmp/php-fcgi.sock
配置文件中定義的socket文件權限為666
12.5 Nginx介紹
Nginx官網:Nginx.org
由俄國人開發
Nginx的靜態文件處理能力比apache強很多
Nginx支持擴展第三方模塊(如支持https等)
目前最新的穩定版本為1.12,1.13已經開發了多個版本但不夠穩定
通常nginx的穩定版本在nginx官網會顯示stable,非穩定版可能會顯示mainline
分支版本
阿裏巴巴公司基於nginx開發了Tengine,使用上與nginx基本相同
Tengine增加了一些定制化的模塊,在安全限速方面性能較好
支持js、css靜態文件的合並:
購物網站上包含大量的圖片等信息,用戶訪問一個頁面時可能會產生大量請求,當並發量高的時候,大量的請求會影響web server的響應能力
Tengine可以將大量的js、css合並一起處理,減少請求的次數
Openresty
使用了nginx的部分功能和lua相關組件、模塊組成的一個支持lua的高性能web容器
lua是一個比較流行的開發語言
應用場景
Web服務:作為web服務端使用
反向代理:
負載均衡(反向代理多臺機器):
8.10 12.1-12.5