linux覆盤:構架搭建lnmp(安裝)

lnmp構架介紹

PHP是以fastcgi的方式結合Nginx的,能夠理解爲Nginx代理了PHP的fastcgi和LAMP不一樣的是,LNMP中提供web服務的是Nginxjavascript

在LNMP架構中PHP是做爲一個獨立的服務存在的,這個服務叫作php-fpmphp

Nginx直接處理靜態請求(支持的併發更高,速度比Apache快),動態請求轉發給php-fpm處理css

mysql安裝

cd /usr/local/srchtml

wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gzjava

tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gznode

mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysqlmysql

cd /usr/local/mysqllinux

useradd -s /sbin/nologin mysqlnginx

mkdir -p /data/mysql #建立數據庫目錄,這個是數據庫喲web

chown -R mysql:mysql /data/mysql

./scripts/mysql_install_db --user=mysql --datadir=/data/mysql #初始化指定用戶和數據庫目錄

cp support-files/my-default.cnf /etc/my.cnf #拷貝配置文件並配置

vim /etc/my.cnf
datadir=/data/mysql 
socket=/tmp/mysql.sock

cp support-files/mysql.server /etc/init.d/mysqld 將啓動腳本添加到系統配置文件中

chmod 755 /etc/init.d/mysqld

vim /etc/init.d/mysqld

basedir=/usr/local/mysql
datadir=/data/mysql

設定開機啓動MySQL:
chkconfig --add mysqld
chkconfig mysqld on

開機:
service mysqld start  /etc/init.d/mysqld start

PHP安裝

PHP是以fastcgi的方式結合Nginx的,能夠理解爲Nginx代理了PHP的fastcgi和LAMP不一樣的是,LNMP中提供web服務的是Nginx

php的安裝有部分不一樣須要注意:須要開啓php-fpm服務

cd /usr/local/src/

wget http://cn2.php.net/distributions/php-5.6.30.tar.gz (下載源碼包)

tar zxvf php-5.6.30.tar.gz

useradd -s /sbin/nologin php-fpm

(該帳號用來運行php-fpm服務,由於在LNMP環境中,PHP是以一種服務的形式獨立存在的)

##進行編譯準備前準備生產makefile
cd 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

--enable-fpm關鍵模塊若是不加不會有php-fpm執行文件生成
mysql相關模塊:若是mysql不在同一臺機器上也要指定模塊,或者直接安裝mysql不啓動

這裏缺乏不少包須要依次安裝後再make&&make install,基本上包含以下:
yum install -y gcc
yum install -y libxml2-devel
yum install -y openssl-devel
yum install -y libjpeg-turbo-devel
yum list|grep libjpeg
yum install -y libjpeg-turbo-devel
yum list|grep png
yum install -y libpng-devel
yum install -y freetype-devel
epel擴展源yum install -y epel-release
yum install -y libmcrypt-deve


make && make install 編譯和安裝
若是是小內存安裝,加上--disable-fileinfo能夠順利安裝

php-fpm相關命令:

/usr/local/php-fpm/bin/php -m 查看php開啓的程序

/usr/local/php-fpm/sbin/php-fpm -t 測試是否正確

將配置文件添加到php-fpm文件目錄cp php.ini-production /usr/local/php-fpm/etc/php.ini

vim /usr/local/php-fpm/etc/php-fpm.conf ###php-fpm主配置文件☆☆☆

[global]
#定義全局參數
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
#監聽地址,也能夠寫:listen = 127.0.0.1::9000,本地監聽,也能夠監聽其餘IP:port
#此處格式會影響配置Nginx和PHP結合時Nginx尋址PHP的路徑
listen.mode = 666
#當監聽的爲socket文件時該部分才生效,用於指定.sock文件的權限
user = php-fpm
group = php-fpm
#定義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
#以上部分爲進程相關信息

###配置完記得-t檢測是否正確

配置啓動腳本

cd /usr/local/src/php-5.6.30

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm 添加啓動腳本到系統配置

chmod 755 /etc/init.d/php-fpm 更改文件權限

service php-fpm start

chkconfig --add php-fpm 添加到系統服務

chkconfig php-fpm on 開機啓動

nginx安裝

cd /usr/local/src

wget http://nginx.org/download/nginx-1.12.1.tar.gz

tar zxf nginx-1.12.1.tar.gz

cd nginx-1.12.1

./configure --prefix=/usr/local/nginx ##能夠添加模塊,按需求進行配置,https等後加

make && make install

建立nginx啓動腳本

vim /etc/init.d/nginx 
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start() 
{
    echo -n $"Starting $prog: "
    mkdir -p /dev/shm/nginx_temp
    daemon $NGINX_SBIN -c $NGINX_CONF
    RETVAL=$?
    echo
    return $RETVAL
}
stop() 
{
    echo -n $"Stopping $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -TERM
    rm -rf /dev/shm/nginx_temp
    RETVAL=$?
    echo
    return $RETVAL
}
reload()
{
    echo -n $"Reloading $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -HUP
    RETVAL=$?
    echo
    return $RETVAL
}
restart()
{
    stop
    start
}
configtest()
{
    $NGINX_SBIN -c $NGINX_CONF -t
    return 0
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload)
        reload
        ;;
  restart)
        restart
        ;;
  configtest)
        configtest
        ;;
  *)
        echo $"Usage: $0 {start|stop|reload|restart|configtest}"
        RETVAL=1
esac
exit $RETVAL

/usr/local/nginx/sbin/nginx -t #檢查錯誤

chmod 755 /etc/init.d/nginx #更改文件權限

chkconfig --add nginx #加入系統服務再設置開機啓動

chkconfig nginx on

更改nginx配置文件

cd /usr/local/nginx/conf/
mv nginx.conf nginx.conf.bak

vim /usr/local/nginx/conf/nginx.conf

user nobody nobody;
#定義啓動nginx的用戶
worker_processes 2;
#定義子進程數目
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
#指定Nginx最多可打開的文件數目
events
{
    use epoll;
    worker_connections 6000;
     #進程最大鏈接數
}
http
{
    include mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 3526;
    server_names_hash_max_size 4096;
    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
    ' $host "$request_uri" $status'
    ' "$http_referer" "$http_user_agent"';
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 30;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 8 4k;
    request_pool_size 4k;
    output_buffers 4 32k;
    postpone_output 1460;
    client_max_body_size 10m;
    client_body_buffer_size 256k;
    client_body_temp_path /usr/local/nginx/client_body_temp;
    proxy_temp_path /usr/local/nginx/proxy_temp;
    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
    fastcgi_intercept_errors on;
    tcp_nodelay on;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 8k;
    gzip_comp_level 5;
    gzip_http_version 1.1;
    gzip_types text/plain application/x-javascript text/css text/htm 
    application/xml;
    server
    {
        listen 80;
        server_name localhost;
        index index.html index.htm index.php;
        root /usr/local/nginx/html;
        location ~ \.php$ 
        {
            include fastcgi_params;
            fastcgi_pass unix:/tmp/php-fcgi.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
        }    
    }
}

/usr/local/nginx/sbin/nginx -t #檢查錯誤

/etc/init.d/nginx start #啓動

測試php解析是否正常:

vim /usr/local/nginx/html/666.php
 <?php
    echo "這裏隨便寫,35天仍是放棄了該如何是好呢";
curl localhost/666.php顯示上面的語句表示成功

lnmp最多見爲502問題環境搭建完成後,一訪問網站直接提示「502 Bad Gateway」緣由大體兩種:

其一配置錯誤

在Nginx配置中location的php配置中,若是把fastcgi_pass(這是用來通訊的)後面指定的路徑配置錯了,那麼就會出現502錯誤,由於Nginx找不到php-fpm了,fastcgi _pass後面能夠跟socket也能夠跟IP+port,默認監聽地址爲:127.0.0.1:9000。

注意: 這裏用兩種形式均可以,可是兩個配置文件(Nginx和php-fpm)中的形式必定要統一,否則絕對502;若是用套接字形式的話,socket文件的路徑必定要對,否則也仍是502

其二資源耗盡

lnmp架構處理PHP時,是Nginx直接調取後端的php-fpm服務,若是Nginx的請求量偏高,而咱們又沒給php-fpm配置足夠的子進程數,那麼總有php-fpm資源耗盡的時候,一旦耗盡Nginx找不到php-fpm,此時也會致使502錯誤出現。解決辦法就是調整php-fpm.conf中的pm.max_children數值,使其增長。但也不能無限制增長,由於服務器的資源有限。4G內存機器若是隻跑php-fpm和Nginx,不跑MySQL服務,pm.max _children能夠設置爲150,儘可能不要超過該數值,8G內存設置爲300,以此類推。

其上未解決呢

在配置文件/usr/local/nginx/conf/nginx.conf中將crit改成debug,使其記錄最多的日誌內容,這樣方便咱們排查錯誤,可是配置更改完成後要記得將級別改回crit,避免日誌文件佔用太多磁盤空間。

相關文章
相關標籤/搜索