天天看點

LNMP應用

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    #可以通過請求的最大檔案數