L=linux 丨 N=nginx 丨 A=apache 丨 P=php 丨 T=tomcatphp
Nginx和Apache都是Web應用服務器html
相對來講,Nginx處理靜態數據快,Apache處理動態快mysql
Nginx對系統資源佔用小,Apache資源佔用高linux
Nginx用得是epoll模型(異步非阻塞IO),Apache用的是select模型(同步阻塞IO)nginx
大約在2010年之前,互聯網公司最經常使用的經典Web服務環境組合就是LAMP(即Linux,Apache,MySQL,PHP),近幾年隨着Nginx Web服務的逐漸流行,
又出現了新的Web服務環境組合--LNMP或LEMP,其中LNMP爲Linux,Nginx,MySQL,PHP等首字母的縮寫,而LEMP中的E則表示Nginx,
它取自Nginx名字的發音(engine x)。如今,LNMP已經逐漸成爲國內大中型互聯網公司網站的主流組合環境,所以,咱們必須熟練掌握LNMP環境的搭建,優化及維護方法。c++
在深刻學習LNMP組合以前,有必要先來了解如下LNMP環境組合的基本原理,也就是它們之間究竟是怎樣互相調度的?
在LNMP組合工做時,首先是用戶經過瀏覽器輸入域名請求Nginx Web服務,若是請求是靜態資源,則由Nginx解析返回給用戶;若是是動態請求(.php結尾),
那麼Nginx就會把它經過FastCGI接口(生產經常使用方法)發送給PHP引擎服務(FastCGI進程php-fpm)進行解析,若是這個動態請求要讀取數據庫數據,
那麼PHP就會繼續向後請求MySQL數據庫,以讀取須要的數據,並最終經過Nginx服務把獲取的數據返回給用戶,
這就是LNMP環境的基本請求順序流程。這個請求流程是企業使用LNMP環境的經常使用流程。sql
用戶的請求必定是遵循HTTP協議的所以是經過瀏覽器過來的
數據庫
(1)Nginx=http格式數據包,9http數據包特色格式很鬆散,所以解析的速度慢,可是數據包比fastcgi格式數據包小apache
(2)接口規則=快速接口,fastcgi數據包,這種規則的數據包,格式很是嚴謹,所以PHP解析的速度很是快,可是越嚴謹的數據包越大,因此fastcgi數據包大小要絕對大於http數據包vim
(3)軟件的設計架構分爲C/S和B/S,做爲客戶端Client的fastcgi和做爲Server端的PHP-fpm,由於常常用,fastcgi_pass和Nginx合併,而PHP-fpm和PHP功能合併了
(4)nginx和apache其實同樣,若是沒有PHP支持,那麼都處理不了所謂的靜態請求,它們自身其實都只能處理靜態,只能apache轉發動態數據包的速度快,可是隻是單個包速度快,apache併發低
(5)代碼是絕對不往存儲裏放的,代碼是不須要作備份的,保證安全的是圖片和視頻。
(6)PHP須要訪問網頁,需不須要掛存儲,要看它什麼功能,若是是讀網頁不須要掛存儲。
http數據包特色:格式鬆散,所以解析速度慢,可是數據包比fastsgi格式數據包小
fastsgi數據包:格式嚴謹,所以解析速度快,可是嚴謹的數據包大,因此fastsgi格式數據包大於http數據包
全都部署在一臺上 LNMP
全都不在一臺上 N+P+M
只分離MySQL NP+M
CGI的全稱爲「通用網關接口」(Common Gateway Interface),爲HTTP服務器與其餘機器上的程序服務通訊交流的一種工具,CGI程序須運行在網絡服務器上。
傳統CGI接口方式的主要缺點是性能較差,由於每次HTTP服務器遇到動態程序時都須要從新啓動解析器來執行解析,以後結果纔會被返回給HTTP服務器。這在處理高併發訪問時幾乎是不可用的,所以就誕生了FastCGI。另外,傳統的CGI接口方式安全性也不好,故而如今已經不多被使用了。
FastCGI是一個可伸縮的,高速地在HTTP服務器和動態腳本語言間通訊的接口(在Linux下,FastCGI接口即爲socket,這個socket能夠是文件socket,也能夠是IP socket),主要優勢是把動態語言和HTTP服務器分離出來。多數流行的HTTP服務器都支持FastCGI,包括Apache,Nginx和Lighttpd等。
同時,FastCGI也被許多腳本語言所支持,例如當前比較流程的腳本語言PHP。FastCGI接口採用的是C/S架構,它能夠將HTTP服務器和腳本解析服務器分開,同時還能在腳本解析服務器上啓動一個或多個腳原本解析守護進程。當HTTP服務器遇到動態程序時,能夠將其直接交付給FastCGI進程來執行,而後將獲得的結果返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求,或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。
FastCGI的重要特色以下:
HTTP服務器和動態腳本語言間通訊的接口或工具。
可把動態語言解析和HTTP服務器分離開。
Nginx,Apache,Lighttpd,以及多數動態語言都支持FastCGI。
FastCGI接口方式採用C/S結構,分爲客戶端(HTTP服務器)和服務器端(動態語言解析服務器)
PHP動態語言服務器端能夠啓動多個FastCGI的守護進程(例如php-fpm(fcgi process mangement))
HTTP服務器經過(例如Nginx fastcgi_pass)FastCGI客戶端和動態語言FastCGI服務器端通訊(例如php-fpm)
Nginx不支持對外部動態程序的直接調用或者解析,全部的外部程序(包括PHP)必須經過FastCGI接口來調用。FastCGI接口在Linux下是socket,爲了調用CGI程序,還須要一個FastCGI的wrapper(能夠理解爲用於啓動另外一個程序的程序),這個wrappper綁定在某個固定的socket上,如端口或文件socket。當Nginx將CGI請求發送給這個socket的時候,經過FastCGI接口,wrapper接收到請求,而後派生出一個新的線程,這個線程調用解釋器或外部程序處理腳原本讀取返回的數據;接着,wrapper再將返回的數據經過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端,這就是Nginx+FastCGI的整個運做過程。
yum install -y pcre-devel openssl-devel gcc gcc-c++ make automake
wget -q http://nginx.org/download/nginx-1.10.2.tar.gz
沒有wget命令須要手動安裝
yum -y install wget
useradd -s /sbin/nologin -M www
tar xf nginx-1.10.2.tar.gz -C /usr/src/
cd /usr/src/nginx-1.10.2
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin
cd /usr/local/nginx/conf
egrep -v "#|^$" nginx.conf.default > nginx.conf
由於安裝PHP須要MySQL的安裝環境,因此須要先安裝MySQL,否則PHP編譯會報錯
如何沒有安裝MySQL須要把--with-mysql=/usr/local/mysql改爲--with-mysql=mysqlnd
useradd -s /sbin/nologin -M mysql
連接:https://pan.baidu.com/s/1dzCH1GsOiMR3i_omOZliHA
提取碼:u6h8
tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -s mysql-5.5.32-linux2.6-x86_64 mysql
cd /usr/local/mysql
/bin/cp support-files/my-small.cnf /etc/my.cnf
echo "192.168.200.129 LNMP" >> /etc/hosts
chown -R mysql.mysql /usr/local/mysql
yum -y install libaio
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
/etc/init.d/mysqld start
ss -antup | grep 3306
chkconfig --add mysqld
chkconfig mysqld on
chkconfig --list mysqld
ln -s /usr/local/mysql/bin/* /usr/local/bin
which mysql
mysqladmin -uroot password '123321'
yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
yum -y install freetype-devel libpng-devel gd libcurl-devel libxslt-devel
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar xf libiconv-1.14.tar.gz -C /usr/src/
cd /usr/src/libiconv-1.14/
./configure --prefix=/usr/local/libiconv && make && make install
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install libmcrypt-devel
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install mhash
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install mcrypt
tar xf php-5.3.28.tar.gz -C /usr/src/
cd /usr/src/php-5.3.28/
./configure --prefix=/usr/local/php5.3.28 --with-mysql=/usr/local/mysql --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-short-tags --enable-zend-multibyte --enable-static --with-xsl --with-fpm-user=www --with-fpm-group=www --enable-ftp
最後的正確輸出提示爲:Thank you for using PHP.
--prefix=/usr/local/php5.2.28
表示指定PHP的安裝路徑爲/usr/local/php5.3.28
--with-mysql=/usr/local/mysql
表示須要指定MySQL的安裝路徑,安裝PHP須要的MySQL相關內容。固然,若是沒有MySQL軟件包,也能夠不單獨安裝,這樣的狀況可以使用--with-mysql=mysqlnd替代--with-mysql=/usr/local/mysql,由於PHP軟件裏已經自帶了鏈接MySQL的客戶端工具。
--with-fpm-user=www
nginx表示指定PHP-FPM進程管理的用戶爲www,此處最好和Nginx服務用戶統一
--with-fpm-group=www
表示指定PHP-FPM進程管理的組爲www,此處最好與Nginx服務用戶組統一。
--enable-fpm
表示激活PHP-FPM方式服務,即以FastCGIF方式運行PHP服務。
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64
touch ext/phar/phar.phar
make
Build complete.
Don't forget to run 'make test'.
make install
ln -s /usr/local/php5.3.28/ /usr/local/php
生產環境:php.ini-development 開發環境:php.ini-production
開發環境更多的是開啓日誌,調試信息,而生產環境都是關閉狀態
cd /usr/src/php-5.3.28
cp php.ini-production /usr/local/php/lib/php.ini
cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf
關於php-fpm.conf,暫時可用默認的配置,先把服務搭好,之後再進行優化。
vim php-fpm.conf
listen = 127.0.0.1:9000 --->如要分離式部署,須要把本地IP改爲遠程IP
/usr/local/php/sbin/php-fpm
ss -antup | grep 9000
cd /usr/local/nginx
vim conf/nginx.conf
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name blog.yunjisuan.com;
location / {
root html/blog; 網頁目錄
index index.html index.htm;
}
location ~ .*\.(php|php5)?$ { 動態網頁
root html/blog;
fastcgi_pass 127.0.0.1:9000; 推到127.0.0.1:9000
fastcgi_index index.php; 動態網頁首頁
include fastcgi.conf; 引進fastcgi.conf模板
}
}
}
/usr/local/nginx/sbin/nginx -t
檢查Nginx配置文件的語法/usr/local/nginx/sbin/nginx
ss -antup | grep 80
此步在生產環境很關鍵,如不提早檢查語法,重啓後發現語法錯誤會致使Nginx沒法提供服務,,給用戶訪問體驗帶來很差的影響。
cd html
mkdir blog
echo "`
hostname -I`
blog.yunjisuan.com" > blog/index.html
vim /etc/hosts
192.168.200.70 LNMP blog.yunjisuan.com
curl blog.yunjisuan.com
echo "<?php phpinfo(); ?>" > blog/test_info.php 或者vim寫入
C:\Windows\System32\drivers\etc --->windows映射文件位置
192.168.200.70 blog.yunjisuan.com
在瀏覽器輸入blog.yunjisuan.com/test_info.php
cd blog
vim test_mysql.php
<?php
$link_id=mysql_connect('localhost','root','123321'); 鏈接mysql的信息交給一個變量,本地,帳號,密碼
if($link_id){ 若是能鏈接上
echo "mysql successful by zz !\n"; 若是能鏈接上輸出
}else{
echo mysql_error(); 若是鏈接不上顯示錯誤頁面
}
?>
若是沒有PHP命令就是沒作軟連接
ln -s /usr/local/php/bin/* /usr/local/bin
php test_mysql.php
用PHP命令激活這個腳本
blog.yunjisuan.com/test_mysql.php
WordPress 是一套利用PHP語言和MySQL數據庫開發的開源免費的blog(博客,網站)程序,用戶能夠在支持PHP環境和MySQL數據庫的服務器上創建blog站點。它的功能很是強大,擁有衆多插件,易於擴充功能。其安裝和使用也都很是方便。目前WordPress已經成爲搭建blog平臺的主流,不少發佈平臺都是根據WordPress二次開發的,若是你也想像他們同樣擁有本身的blog,可購買網上的域名及空間,而後搭建LNMP環境,部署WordPress程序後就能夠輕鬆成就本身的夢想了。
WordPress是單用戶我的博客與多用戶博客是有區別的。
mysql -uroot -p123321 --->登錄MySQL數據庫
create database wordpress; --->建立一個名字爲wordpress的數據庫存放blog數據
grant all on wordpress.* to wordpress@'localhost' identified by '123321';
建立一個專用的WordPress blog管理用戶
localhost只容許本機經過wordpress用戶訪問數據庫flush privileges; --->刷新權限,使得建立用戶生效
exit
vim /usr/local/nginx/conf/nginx.conf
須要在index後補一個首頁文件index.php
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
www.wordpress.org下載博客程序
連接:https://pan.baidu.com/s/1hGyd1xFuL0oPBsFeROuUYQ
提取碼:tmgk
tar xf wordpress-4.9.8.tar.gz
cd /usr/local/nginx/html/blog
rm -rf *
mv ~/wordpress/* .
chown -R www.www /usr/local/nginx/html/blog
瀏覽器輸入blog.yunjisuan.com,進入界面安裝,選擇中文
數據庫名 --->前面建立的數據庫 用戶 --->專用的用戶名 密碼 --->數據庫密碼 數據庫主機 --->容許訪問的數據庫主機,這裏是LNMP一體的環境因此localhost最安全 表前綴 --->爲了安全改一下,防止黑客猜你的表名
站點標題 --->博客主頁的名字
用戶名 --->登錄博客的用戶
密碼 --->登錄博客的密碼
您的電子郵件 --->有問題發送的郵箱
對搜索引擎的可見性 --->測試環境須要取消,有的時候會打不開,會致使瀏覽速度很慢
安裝完WrodPress後直接登錄便可,進入的是後臺頁面
網頁輸入域名測試
實現此功能時,首先要在Settings-固定連接-自定義結構-添加代碼-保存更改
/archives/%post_id%.html
vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name blog.yunjisuan.com;
location / {
root html/blog;
index index.php index.html index.htm;
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
location ~ .*\.(php|php5)?$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
}
}
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
blog.yunjisuan.com
建立文章,點擊文章能夠看見:
上傳圖片須要作2個操做,圖片放到存儲裏,放在存儲的位置須要寫到數據庫裏
vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name xxx.yunjisuan.com;
location / {
root html/xxx;
index index.html index.htm;
}
}
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
cd /usr/local/nginx/html
mkdir xxx
chown -R www.www xxx/
vim xxx/index.html
在把須要用的圖片,導入虛擬機裏
<img src="http://192.168.200.132/666.jpg" />
加入本地映射 vim /etc/hosts
windows映射就不演示了,本身添加一下就好
網站測試
cd /usr/local/nginx/logs
>access.log
瀏覽器單獨發起請求在去拿圖片,圖片都是後拿的