LNMP 工作流程;
使用者通過浏覽器請求nginx web服務,如果是靜态資源,nginx直接解析傳回給使用者。
如果是動态請求(.php),nginx 通過FastCGI接口發送給PHP引擎服務(FastCGI程序php-fpm)解析,
請求要求讀取資料庫,PHP會請求mysql據庫庫,以讀取需求的資料,并最終通過nginx把擷取的資料
傳回給使用者。
1.安裝配置mysql:
1.建立mysql使用者。 #useradd -s /sbin/nologin -M
2.采用二進制方式安裝mysql
(mysql-5.5.53-linux2.6-x86_64.tar.gz二進制名稱比源碼包多了核心和CPU架構)
(1)解壓到指定路徑,建立軟連結
# tar zxvf mysql-5.5.53-linux2.6-x86_64.tar.gz
# mv mysql-5.5.53-linux2.6-x86_64 /application/mysql-5.5.53
# ln -s /application/mysql-5.5.53/ /application/mysql
3.初始化mysql配置檔案my.cnf
# mv /etc/my.cnf /etc/my.cnf.bak
# /bin/cp support-files/my-small.cnf /etc/my.cnf
# diff /etc/my.cnf support-files/my-small.cnf
4.初始化mysql資料庫檔案:
# mkdir -p /application/mysql/data
# chown -R /application/mysql/
# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data/ --user=mysql
一般出現:
OK
Filling help tables...
170201 16:47:32 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap.
170201 16:47:32 [Note] /application/mysql/bin/mysqld (mysqld 5.5.53) starting as process 19530 ...
2個OK字段代表初始化成功。
5.配置并啟動mysql資料庫。
# cp ./support-files/mysql.server /etc/init.d/mysqld
# sed -i "s#/usr/local/mysql#/application/mysql#g" /etc/init.d/mysqld /application/mysql/bin/mysqld_safe
6.啟動資料庫并檢查啟動情況:
# service mysql start
檢視; # netstat -lnutp | grep msyqld
# lsof -i:3306
# ps -ef | grep mysqld
以上三種方法均可。(原理就是通過端口号或路徑檢視mysql的啟動狀态)
如果出現問題可以檢視 mysql/data/主機名.err (mysql相對應的日志)
7.開機自動啟動mysql 并将mysql寫入系統變量友善應用
# chkconfig mysqld on
# echo ' export PATH=/application/mysql/bin:$PATH' >> /etc/profile
# source /etc/profile
# which mysqld
/application/mysql/bin/mysqld
8.正式進入資料庫:
# mysql
mysql>
如果出現:Access denied for user 這樣的字樣。
因為是第一次登入資料庫,預設就是root使用者無密碼狀态。排除了mysql啟動問題。
最有可能的原因是資料庫初始化出現問題:一般清空data 目錄内容。重新初始化。
檢查mysql目錄權限,或者是主機名對應ip解析是否正确。
9.加強mysql
1.為mysql設定密碼
# mysqladmin -uroot password 'swallow'
2.清空無用的mysql使用者和庫。
mysql> drop database test;
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | swallow |
| root | swallow |
mysql> drop user 'root'@'::1';
(使用drop指令 格式是 drop tablesname 'uservalue'@'對應的hostvalue')
如果遇到大寫字元,有時候drop不太好用可以使用 delete
mysql> delete from mysql.user where user='root' and host='swallow';
(delete from databasename.tablesname where user='uservalue' and host='hostname')
一般優化後:
mysql> select user,host from user;
FastCGI簡介;
CGI(common gateway interface 通用網關接口)是http伺服器與其它機器上的程式服務通信交流的一種工具。
缺點是:性能差。每次連接配接時都需要重新啟動解析器。
FastCGI是一個可伸縮地,高速地在http伺服器和動态腳本語言間通信的接口(linux下,FastCGI接口就是一個socket,
這個socket可以是socket檔案也可以是IPsocket)優點:就是把動态語言和http伺服器分離開來。
FastCGI主要特點:
1.給http伺服器和動态語言(PHP)間通信提供接口
2.把動态語言解析和web伺服器分離
3.FastCGI接口方式采用C/S結構,分為用戶端(web伺服器)和伺服器端(動态語言解析伺服器)
nginx下FastCGI運作的原理:
nginx(fastcgi_pass接口)<=FastCGI=> php-fpm <=wrapper=> php解析器 <=Access database=>mysql
簡訴為:nginx遇到動态程式。通過fastcgi_past 和FastCGI相連,PHP端通過 php-fpm 生成的wrapper 連接配接到PHP的解析器。(
如果有必要PHP連接配接mysql)解析完畢後傳回給nginx。這樣操作:把動态語言的解析和nginx分離,nginx專門處理靜态請求和
向後轉發動态請求。PHP/PHP-FPM解析PHP動态請求。
2.nginx下PHP的安裝:
首先确定:nginx和mysql正常使用。
#lsof -i:80 ;lsof -i:3306
1.檢查PHP所需要的lib庫(PHP腳本語言的的強大也是需要大量庫的支援)
企業應用需要 zlib-devel libxml2-devel libjpeg-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel 這些庫的支援
其中 libjpeg-turbo-devel 是libjpeg-devel 的早期名稱
這裡啟用yum安裝:
# yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel -y
# yum install freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel -y
其中 libiconv ,需要手動編譯。(yum沒有這個包)
# wget https://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz --no-check-certificate
./configure --prefix=/usr/local/libiconv
make
make install
才外還需要幾個涉及算法和加密的庫檔案:libmcrypt mhash mcrypt
這3個庫需要epel的第三方yum源。下面建構這個yum 源:(利用阿裡的鏡像)
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
# yum install libmcrypt mhash mcrypt -y
源碼安裝一般包括3個部分:./configure 分析系統環境(根據開啟的支援子產品功能去測試庫檔案是否齊全)
make (編譯) make install (安裝)
2.php 源碼包下載下傳位址:
http://cn2.php.net/get/php-5.5.38.tar.gz/from/this/mirror
解壓,配置安裝:
# ./configure \
--prefix=/application/php5.5.38 \
--with-mysql=/application/mysql \
--with-pdo-mysql=mysqlnd \
--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-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--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-soap \
--enable-short-tags \
--enable-static \
--with-xsl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-ftp \
--enable-opcache=no
3.編譯安裝:
/data/php-5.5.38/sapi/cli/php: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
出現報錯。庫檔案缺少支援。
# ln -s /application/mysql/lib/libmysqlclient.so.18 /usr/lib64/
chmod: cannot access `ext/phar/phar.phar': No such file or directory
make: [ext/phar/phar.phar] Error 1 (ignored)
還有一個可以忽略的錯誤;找不到 這個檔案: # touch ext/phar/phar.phar
# make
Build complete.
Don't forget to run 'make test'.
至此,編譯通過 執行 # make install
4.配置PHP的引擎檔案php.ini 和PHP服務(FastCGI方式)的配置檔案 php-fpm.conf
# ln -s /application/php-5.5.38 /application/php
# cp php.ini-production /application/php/lib/php.ini
# cd /application/php/etc/; cp php-fpm.conf.default php-fpm.conf
最後啟動PHP(FastCGI模式)
# /application/php/sbin/php-fpm
[root@swallow etc]# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 22274 root 7u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 22275 nginx 0u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 22276 nginx 0u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
3.配置nginx支援PHP程式通路請求:
這裡以blog配置為例:在 extra/blog.conf中添加
location ~ .*\.(php|php5)?$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
重新開機nginx服務
建立測試檔案測試:
# cd html/blog/ ; echo "<?php phpinfo() ?>" >test_info.php
測試與mysql的連通性:
# vim test_mysql.php
<?php
$link_id=mysql_connect('localhost','root','swallow') or mysql_error();
if ($link_id){
echo "mysql successful by swallow\n";
}else{
echo mysql_error();
}
?>
# curl blog.swallow.com/test_mysql.php
mysql successful by swallow
php.ini 幾個重要參數:(前面數字為行号)
363 expose_php = On #開啟表示顯示PHP版本資訊
466 display_errors = Off #錯誤資訊控制,測試地時候開啟
487 log_errors = On #開啟日志
803 allow_url_fopen = On #開啟遠端打開(禁止)
相關業務場景:
372 max_execution_time = 30 # 單個腳本運作最大時間。機關為秒
382 max_input_time = 60 # 單個腳本等待輸入的最長時間
393 memory_limit = 128M #單個腳本最大使用記憶體
792 upload_max_filesize = 2M #上傳檔案最大許可
795 max_file_uploads = 20 #可以通過請求的最大檔案數
本文轉自 swallow_zys 51CTO部落格,原文連結:http://blog.51cto.com/12042068/1894561,如需轉載請自行聯系原作者