主要概念:
1.LNMP=Linux+NGINX+MySQL+PHP
Nginx是一個高性能的http和反向代理服務器
MySQL是一個小型關係型數據管理系統
PHP是一種在服務器端執行的嵌入HTML文檔的腳本語言
這四個都是免費開源的軟件,組合起來就是一個免費高效擴展性強的網站服務系統
2.LNMP的工作流程:
client —>瀏覽器—>nginx —>靜態的直接返回給client,動態的 —>php —>數據庫中找資源
3.LNMP架構代表的就是Linux系統下NGINX+MySQL+PHP這種網站服務器的架構。NGINX中的PHP是以fastcgi的方式結合nginx的,可以理解爲Nginx代理了PHP的fastcgi
4.工作方式:
(1)首先,瀏覽器發送http request請求到服務器(Nginx)
(2)服務器響應並處理web請求,將一些靜態資源(CSS,圖片,視頻等)保存服務器上,然後將php腳本通過接口傳輸協議(網關協議)PHP-FCGI(fast-cgi)傳輸給PHP-FPM(進程管理程序)
(3)PHP-FPM不做處理,然後PHP-FPM調用PHP解析器進程,PHP解析器解析php腳本信息。
(4)PHP解析器進程可以啓動多個,進行併發執行。然後將解析後的腳本返回到PHP-FPM
(5)PHP-FPM再通過fast-cgi的形式將腳本信息傳送給Nginx
(6)服務器再通過Http response的形式傳送給瀏覽器。
5 . LNMP和LAMP的區別:
LNMP和LAMP唯一不同是指提供web服務的是Nginx,
在Apache中,PHP是作爲一個模塊存在的。而在Nginx中,PHP是作爲一個獨立服務存在的,這個服務叫做php-fpm。
Nginx直接處理靜態請求,動態請求會轉發給php-fpm
6. LNMP的特點:
7. Nginx的性能穩定,功能豐富,處理靜態文件速度快且消耗的系統資源較少,支持比Apache更多的併發連接數,效率更高
注:CGI 通用網關接口
在解析的過程中不能響應請求
fattcgi將兩者分開,解析的同時也能響應請求
fastcgi_pass相當於一個反向代理 將請求交給php,讓php處理動態的請求
mysql_connect連接數據庫管理系統
mysql_select查詢數據
memcachad緩存 每一級都可加緩存
實驗環境:
主機名 | IP | 服務 |
---|---|---|
server1 | 172.25.68.1 | mysqld,php,nginx |
一、給虛擬機擴容:
mysql源碼編譯時要求虛擬機的硬盤大小不能小於20G,否則後邊的編譯過程會出問題,爲了提升速度我們再增加CPU核數和內存大小
1.開機之前先打開虛擬機圖形管理器,將cpu核數增加,擴大內存爲2048,添加一個硬盤
2.開機後查看,出現新增的硬盤,/dev/sdb
[root@server1 ~]# fdisk -l
3.更改新增磁盤的標籤以及分區
[root@server1 ~]# fdisk /dev/sdb
4.修改後可以看到這個磁盤變成了一和lvm類型的設備
[root@server1 ~]# fdisk -l
5.將新增的磁盤擴充到磁盤的邏輯卷dev/mapper/VolGroup中
[root@server1 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[root@server1 ~]# vgextend VolGroup /dev/sdb1
Volume group "VolGroup" successfully extended
[root@server1 ~]# lvextend -L 30G /dev/mapper/VolGroup-lv_root
Extending logical volume lv_root to 30.00 GiB
Insufficient free space: 5494 extents needed, but only 5118 available
[root@server1 ~]# lvextend -l +5118 /dev/mapper/VolGroup-lv_root
Extending logical volume lv_root to 28.53 GiB
Logical volume lv_root successfully resized
6.再次查看磁盤的大小發生變化
[root@server1 ~]# fdisk -l
Disk /dev/mapper/VolGroup-lv_root: 30.6 GB, 30635196416 bytes
7.查看掛載情況,沒有變化
[root@server1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 8.5G 1.1G 7.0G 13% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
8.重新加載後查看發生變化,擴容成功
[root@server1 ~]# resize2fs /dev/mapper/VolGroup-lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/VolGroup-lv_root is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/VolGroup-lv_root to 7479296 (4k) blocks.
The filesystem on /dev/mapper/VolGroup-lv_root is now 7479296 blocks long.
[root@server1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 29G 1.1G 26G 4% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
二、安裝mysql
1.下載一個安裝包,解壓
[root@server1 ~]# ls
bansys mysql-boost-5.7.17.tar.gz varnish-libs-3.0.5-1.el6.x86_64.rpm
bansys.zip varnish-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# tar zxf mysql-boost-5.7.17.tar.gz
[root@server1 ~]# ls
bansys mysql-5.7.17 varnish-3.0.5-1.el6.x86_64.rpm
bansys.zip mysql-boost-5.7.17.tar.gz varnish-libs-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# cd mysql-5.7.17/
2.新建一個目錄,作爲mysql的目錄
[root@server1 mysql-5.7.17]# mkdir /usr/local/lnmp/
3.安裝cmake軟件(c++編譯)
[root@server1 mysql-5.7.17]# yum install cmake -y
cmake跨平臺工具時用來編譯mysql源碼的,用於設置mysql的編譯參數,如安裝目錄,數據存放目錄,字符編碼,排序規則等
4.編譯(這個過程中會出現很多問題,一個一個解決)
<1>第一次編譯:報錯cmake版本太低
[root@server1 mysql-5.7.17]# cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql \ #安裝目錄
> -DMYSQL_DATADIR=/usr/local/lnmp/mysql/data \ #數據庫存放目錄
> -DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock \ #Unix socket 文件路徑
> -DWITH_MYISAM_STORAGE_ENGINE=1 \ #安裝 myisam 存儲引擎
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #安裝 innodb 存儲引擎
> -DDEFAULT_CHARSET=utf8 \ #使用 utf8 字符
> -DDEFAULT_COLLATION=utf8_general_ci \ #校驗字符
> -DEXTRA_CHARSETS=all #安裝所有擴展字符集
下載一個更高版本的cmake安裝包,安裝軟件
[root@server1 ~]# ls
bansys mysql-boost-5.7.17.tar.gz
bansys.zip varnish-3.0.5-1.el6.x86_64.rpm
cmake-2.8.12.2-4.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
mysql-5.7.17
[root@server1 ~]# yum install cmake-2.8.12.2-4.el6.x86_64.rpm -y
<2>第二次編譯:報錯缺少一個參數
[root@server1 ~]# cd mysql-5.7.17/
[root@server1 mysql-5.7.17]# ls
[root@server1 mysql-5.7.17]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql
-DMYSQL_DATADIR=/usr/local/lnmp/mysql/data
-DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock
-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
-DEXTRA_CHARSETS=all
<3>第三次:添加參數再次編譯,報錯沒有安裝ncurses-devel
[root@server1 mysql-5.7.17]# cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql
-DMYSQL_DATADIR=/usr/local/lnmp/mysql/data
-DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock
-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
-DEXTRA_CHARSETS=all
-DWITH_BOOST=boost/boost_1_59_0/
安裝依賴性
[root@server1 mysql-5.7.17]# yum install -y ncurses-devel
<4>第四次:報錯一出緩存文件
刪除編譯緩存文件,再次編譯
[root@server1 mysql-5.7.17]# ls
[root@server1 mysql-5.7.17]# rm -fr CMakeCache.txt
[root@server1 mysql-5.7.17]# ls
<5>第五次編譯:報錯c++的依賴性沒有安裝
安裝gcc gcc-c++
[root@server1 mysql-5.7.17]# yum install gcc gcc-c++ -y
<6>第六次:刪除緩存文件再次編譯,報錯bison沒有安裝
[root@server1 mysql-5.7.17]# rm -fr CMakeCache.txt
[root@server1 mysql-5.7.17]# cmake
-DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql
-DMYSQL_DATADIR=/usr/local/lnmp/mysql/data
-DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock
-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DEXTRA_CHARSETS=all
-DWITH_BOOST=boost/boost_1_59_0/
安裝bison
<7>第七次編譯:刪除緩存文件,再次編譯,編譯成功
5.安裝
6.安裝包
7.安裝之後可以看到/usr/local/lnmp目錄下生成了mysql目錄,而mysql目錄下有一些子目錄和文件
[root@server1 mysql-5.7.17]# cd /usr/local/lnmp
[root@server1 lnmp]# ls
mysql
[root@server1 lnmp]# cd mysql/
[root@server1 mysql]# ls
bin COPYING docs include lib man mysql-test README share support-files
8.將mysql的配置文件複製到etc下
備份/etc/my.cnf文件爲/etc/my.cnf.bak
[root@server1 mysql]# cd /etc/
[root@server1 etc]# cp my.cnf my.cnf.bak
mysql的默認配置文件在support-files目錄下,將mysql配置文件賦值爲/etc/my.cnf文件
[root@server1 etc]# cd -
/usr/local/lnmp/mysql
[root@server1 mysql]# cd support-files/
[root@server1 support-files]# ls
magic my-default.cnf mysqld_multi.server mysql-log-rotate mysql.server
[root@server1 support-files]# vim my-default.cnf
[root@server1 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y
[root@server1 support-files]#
9.編輯mysql的配置文件,內容如下:
basedir = /usr/local/lnmp/mysql
datadir = /usr/local/lnmp/mysql/data
# port = .....
# server_id = .....
socket = /usr/local/lnmp/mysql/data/mysql.sock
[root@server1 ~]# vim /etc/my.cnf
[root@server1 ~]#
10.創建mysql組和用戶
[root@server1 ~]# groupadd -g 27 mysql
[root@server1 ~]# useradd -u 27 -g 27 mysql
[root@server1 ~]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
[root@server1 ~]#
11.新建一個data目錄作爲數據存放目錄,修改目錄的屬性,讓mysql用戶對這個目錄有操作的權限
[root@server1 mysql]# mkdir data
[root@server1 mysql]# ll
[root@server1 mysql]# chgrp mysql /usr/local/lnmp/mysql -R
[root@server1 mysql]# chown mysql /usr/local/lnmp/mysql/data/ -R
[root@server1 mysql]# ll
12.將編譯生成的mysql二進制命令放進系統環境變量的文件中,保證可以直接使用二進制命令(配置完之後mysql命令可以自動補齊)
[root@server1 mysql]# vim ~/.bash_profile
[root@server1 mysql]#
[root@server1 mysql]# source ~/.bash_profile
[root@server1 mysql]#
13.將編輯生成的mysql啓動腳本複製到系統服務的目錄中,保證腳本有可執行權限
[root@server1 mysql]# cd support-files/
[root@server1 support-files]# ls
magic my-default.cnf mysqld_multi.server mysql-log-rotate mysql.server
[root@server1 support-files]# cp mysql.server /etc/init.d/mysqld
[root@server1 support-files]# ll /etc/init.d/mysqld
-rwxr-xr-x 1 root root 10916 Apr 26 22:47 /etc/init.d/mysqld
[root@server1 support-files]# cd
14.將mysql初始化,這時data目錄下不能有任何文件,如果有的話刪除
[root@server1 ~]# mysqld --user=mysql --initialize
[root@server1 data]# cd
[root@server1 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/usr/local/lnmp/mysql/data/server1.err'.
.. SUCCESS!
15.初始化文成後會生成一個臨時密碼,用這個密碼登陸數據庫,查看數據失敗,這是因爲沒有進行安全初始化
[root@server1 ~]# mysql -p
16.對mysql進行安全初始化,按照提示進行即可
[root@server1 ~]# mysql_secure_installation
17.再次進入數據庫查看,可以查看
[root@server1 ~]# mysql -uroot -p
Enter password:
三、源碼安裝php
1.下載一個php的安裝包,解壓
2.安裝編譯php源碼時需要的依賴性
3.進行編譯
編譯時出錯,提示需要libmcrypt的依賴性,下載一個libmcrypt的安安裝包,安莊後再次編譯,編譯成功
編譯完是這樣的
4.安裝
make && make install
5.安裝成功後會看到/usr/local/lnmp下會出先一個php目錄
6.切換到這個目錄下,編輯php的默認配置文件
25 pid = run/php-fpm.pid ##pid行去掉註釋
149 user = nginx
150 group = niginx ##保證用戶和組都是nginx
7.將源碼包中的php。ini文件複製到安裝後的目錄中
編輯這個文件
更改時區
8.將php的啓動文件複製到系統啓動腳本的默認目錄下
9.創建nginx用戶
10.啓動php服務,啓動成功後可以查看到他使用的端口
四、源碼安裝NGINX
1.解壓安裝包
[root@server1 ~]# tar zxf nginx-1.14.0.tar.gz
[root@server1 ~]# ls
2.切換到解壓出的目錄,修改下面文件的內容
(1)去掉版本號
[root@server1 nginx-1.14.0]# vim src/core/nginx.h
[root@server1 nginx-1.14.0]#
#define NGINX_VER "nginx/"
(2)去掉debug日誌(debug日誌的級別很低,會產生很多數據,一般不需要開啓)
[root@server1 nginx-1.14.0]# vim auto/cc/gcc
171 # debug
172 # CFLAGS="$CFLAGS -g"
3.創建編譯環境,添加需要的模塊
第一次編譯:報錯需要安裝pcre庫
[root@server1 nginx-1.14.0]# ./configure
--prefix=/usr/local/lnmp/nginx
--with-threads
--with-file-aio
--with-http_ssl_module
--with-http_stub_status_module
--user=nginx
--group=nginx
解決依賴性
[root@server1 nginx-1.14.0]# yum install pcre-devel -y
再次編譯:編譯成功
[root@server1 nginx-1.14.0]# ./configure
--prefix=/usr/local/lnmp/nginx
--with-threads
--with-file-aio
--with-http_ssl_module
--with-http_stub_status_module
--user=nginx
--group=nginx
4.安裝
[root@server1 nginx-1.14.0]# make && make install
安裝後在/usr/local/lnmp目錄下會產生一個nginx子目錄
5.配置nginx服務
[root@server1 nginx-1.14.0]# cd /usr/local/lnmp/
[root@server1 lnmp]# ls
mysql nginx php
[root@server1 lnmp]# cd nginx/
[root@server1 nginx]# ls
conf html logs sbin
[root@server1 nginx]# cd conf/
[root@server1 conf]# ls
fastcgi.conf koi-win scgi_params
fastcgi.conf.default mime.types scgi_params.default
fastcgi_params mime.types.default uwsgi_params
fastcgi_params.default nginx.conf uwsgi_params.default
koi-utf nginx.conf.default win-utf
[root@server1 conf]# vim nginx.conf
2 user nginx nginx;
3 worker_processes 2;
43 location / {
44 root html;
45 index index.php index.html index.htm;
46 }
65 location ~ \.php$ {
66 root html;
67 fastcgi_pass 127.0.0.1:9000;
68 fastcgi_index index.php;
69 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
70 include fastcgi.conf;
71 }
切換到nginx/sbin目錄下可以進行語法檢測,檢查配置文件中有沒有語法問題
[root@server1 conf]# cd ..
[root@server1 nginx]# ls
conf html logs sbin
[root@server1 nginx]# cd sbin/
[root@server1 sbin]# ls
nginx
[root@server1 sbin]# ./nginx -t
nginx: the configuration file /usr/local/lnmp/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/lnmp/nginx/conf/nginx.conf test is successful
[root@server1 sbin]#
-v查看版本號
[root@server1 sbin]# ./nginx -v
nginx version: nginx/
-V查看編譯環境
[root@server1 sbin]# ./nginx -V
nginx version: nginx/
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/lnmp/nginx --with-threads --with-file-aio
--with-http_ssl_module --with-http_stub_status_module --user=nginx --group=nginx
6.創建一個軟連接可以直接使用nginx命令
[root@server1 sbin]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
[root@server1 sbin]#
[root@server1 sbin]# nginx -t
nginx: the configuration file /usr/local/lnmp/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/lnmp/nginx/conf/nginx.conf test is successful
7.打開服務查看端口號
[root@server1 sbin]# nginx
[root@server1 sbin]# netstat -tnlp
打開服務後可以看到多出了幾個子目錄
[root@server1 sbin]# cd ..
[root@server1 nginx]# ls
client_body_temp fastcgi_temp logs sbin uwsgi_temp
conf html proxy_temp scgi_temp
8.打開瀏覽器,訪問測試
出現nginx的頁面
9.編輯一個php文件,瀏覽器訪問測試
[root@server1 sbin]# cd ..
[root@server1 nginx]# ls
client_body_temp fastcgi_temp logs sbin uwsgi_temp
conf html proxy_temp scgi_temp
[root@server1 nginx]# cd html/
[root@server1 html]# ls
50x.html index.html
[root@server1 html]# vim index.php
[root@server1 html]# ls
50x.html index.html index.php
<?php
phpinfo()
?>
瀏覽器中刷新後出現php頁面,說明nginx和php結合成功