LNMP架構環境搭建 原

 
11月23日任務
 
12.1 LNMP架構介紹
12.2 MySQL安裝
12.3/12.4 PHP安裝
12.5 Nginx介紹
 
12.6 Nginx安裝
 

LNMP架構介紹

LNMP = Linux + Ningx + Mysql + PHP

由Nginx取代apache,提供web服務;

PHP作爲一個獨立服務存在而非apache的一個模塊,這個服務爲php-fpm;

Nginx直接處理靜態請求,動態請求會轉發給php-fpm。

Nginx在處理靜態文件的速率較Apache要快的多,這時兩者的底層設計所決定的。同時Nginx可以處理的併發訪問量也較Apache要大的多,畢竟Apache創建之初並沒有考慮到當今的高併發訪問量的規模會如此之大。Apache採用的是多進程的方式,對內存的要求會較高,而且有限制;Nginx採用多線程的方式,在內存消耗方面要比Apache好的多。

Mysql的安裝

Mysql安裝的方法與LAMP架構中一致

可能缺少的軟件包:

[root@localhost src]# yum install -y perl-Data-Dumper libaio-devel

具體操作如下:

  • 解壓軟件包,重命名並移動至/usr/local
[root@localhost src]# tar zxf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz 
[root@localhost src]# mv mysql-5.6.36-linux-glibc2.5-x86_64 /usr/local/mysql
  • 創建相關目錄和用戶
[root@localhost src]# cd /usr/local/mysql/
[root@localhost mysql]# useradd mysql
[root@localhost mysql]# mkdir /data
  • 初始化
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
  • 配置my.cnf
[root@localhost mysql]# cp support-files/my-default.cnf /etc/my.cnf
[root@localhost mysql]# vi /etc/my.cnf
"修改[mysqld]內的2行即可
 basedir = /usr/local/mysql
 datadir = /data/mysql
保存退出"
  • 配置自啓動腳本
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# vi /etc/init.d/mysqld 
"同樣要修改一下參數
basedir=/usr/local/mysql
datadir=/data/mysql"
  • 配置開啓啓動並啓動服務
[root@localhost mysql]# chmod 755 /etc/init.d/mysqld 
[root@localhost mysql]# chkconfig --add mysqld
[root@localhost mysql]# service mysqld start

本人安裝過程中報的一個錯(讀安裝過程報錯十分重要)

...
./bin/mysqld: Can't create/write to file '/tmp/iboFQUc3' (Errcode: 30 - Read-only file system)
...

發現是我之前在tmp下掛載了磁盤鏡像,mysql_install_db腳本對/tmp目錄又有寫權限導致的錯誤。執行umount /tmp後,腳本運行正常。

PHP的安裝

PHP的安裝的部分參數較LAMP不同

  1. 解壓壓縮包
[root@localhost src]# tar zxvf php-5.6.30.tar.gz
[root@localhost src]# cd php-5.6.30
  1. 創建用戶php-fpm
[root@localhost src]# useradd -M -s /sbin/nologin php-fpm
  1. 安裝依賴包
[root@localhost php-5.6.30]# yum install -y epel-release
[root@localhost php-5.6.30]# yum install -y gcc gcc-c++ libxml2-devel openssl-devel libcurl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel
  1. 編譯安裝
[root@localhost 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
[root@localhost php-5.6.30]# make && make install

php7版本已經取消--with-mysql參數,編譯安裝時該參數不寫,寫了會報錯

  1. 修改配置文件
[root@localhost php-5.6.30]# cp php.ini-production /usr/local/php-fpm/etc/php.ini
[root@localhost php-5.6.30]# cd  /usr/local/php-fpm/etc
[root@localhost etc]# vi php-fpm.conf
[root@localhost etc]# cat php-fpm.conf
[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  # 監聽socket
#listen = 127.0.0.1:9000
listen.mode = 666 # 監聽是socket纔會生效
user = php-fpm  # 定義用戶
group = 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
  1. 設置啓動腳本,並設置開機啓動
# 啓動腳本模板文件在/usr/local/src/php-5.6.30/sapi/fpm/init.d.php-fpm
[root@localhost etc]# cd /usr/local/src/php-5.6.30
[root@localhost php-5.6.30]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-5.6.30]# chmod 755 /etc/init.d/php-fpm 
[root@localhost php-5.6.30]# chkconfig --add php-fpm
[root@localhost php-5.6.30]# chkconfig --level 345 php-fpm on
  1. 啓動php-fpm服務
[root@localhost php-5.6.30]# service php-fpm start
Starting php-fpm  done

php-fpm腳本用法

相對於LAMP中php安裝目錄,LNMP安裝的php多了一些文件、目錄


[root@localhost php-5.6.30]# ls /usr/local/php-fpm/
bin  etc  include  lib  php  sbin  var
[root@localhost php-5.6.30]# ls /usr/local/php-fpm/var/
log  run

# sbin目錄下是php-fpm啓動腳本
[root@localhost php-5.6.30]# ls /usr/local/php-fpm/sbin/
php-fpm
  • 查看編譯參數
[root@localhost php-5.6.30]# /usr/local/php-fpm/sbin/php-fpm -i | grep -i configure
[19-Dec-2017 22:10:30] NOTICE: PHP message: PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0
Configure Command =>  './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'
  • 查看php的模塊
[root@localhost ~]# /usr/local/php-fpm/sbin/php-fpm -m
[PHP Modules]
cgi-fcgi
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
...

  • 檢查php-fpm配置文件語法
[root@localhost ~]# /usr/local/php-fpm/sbin/php-fpm -t
[02-Jan-2018 21:43:03] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

安裝過程報錯提示及解決方法

  • "error: xml2-config not found."
yum install -y libxml2-devel
  • "error: Cannot find OpenSSL's <evp.h>"
yum install -y openssl-devel
  • "error: Please reinstall the libcurl distribution"
yum install -y libcurl-devel
  • "error: jpeglib.h not found"
yum install -y libjpeg-devel
  • "error: png.h not found"
yum install -y libpng-devel
  • "error: freetype-config not found"
yum install -y freetype-devel
  • "error: mcrypt.h not found"
yum install -y epel-release
yum install -y libmcrypt-devel

Nginx介紹

官網 nginx.org,由俄羅斯程序員開發的一種web服務器,小巧而強大。Ningx在處理靜態文件方便較apache更好,被更多國內外網站也採用。Ningx可以通過外接模塊來擴展功能,這點與apache一樣。

Ningx不僅可以應用於web服務,同樣可以用於反向代理服務以及負載均衡。

Nginx是一個開源的軟件,淘寶基於其開發的Tengine,在使用上與其一致,其內的服務名、配置文件等都一致,不同的是它添加了一些定製化的模塊,在安全限速方面的表現很好,另外還支持對js、css合併功能。

openresty:一個由Nginx核心+lua相關組件和模塊組成的支持lua的高性能web容器。

Nginx安裝

當前最新穩定版:http://nginx.org/download/nginx-1.12.2.tar.gz

  • 下載並解壓
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget http://nginx.org/download/nginx-1.12.2.tar.gz
--... 22:22:26--  http://nginx.org/download/nginx-1.12.2.tar.gz
正在解析主機 nginx.org (nginx.org)... 206.251.255.63, 95.211.80.227, 2606:7100:1:69::3f, ...
正在連接 nginx.org (nginx.org)|206.251.255.63|:80... 已連接。
已發出 HTTP 請求,正在等待迴應... 200 OK
長度:981687 (959K) [application/octet-stream]
正在保存至: “nginx-1.12.2.tar.gz”

100%[============================>] 981,687     74.1KB/s 用時 9.3s   

... 22:22:36 (103 KB/s) - 已保存 “nginx-1.12.2.tar.gz” [981687/981687])

[root@localhost src]# tar zxf nginx-1.12.2.tar.gz
  • 編譯、安裝
[root@localhost src]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@localhost src]# make && make install
  • 創建啓動腳本
[root@localhost nginx-1.12.2]# 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
  • 更改配置文件權限並開機啓動
[root@localhost nginx-1.12.2]# chmod 755 /etc/init.d/nginx 
[root@localhost nginx-1.12.2]# chkconfig --add nginx
[root@localhost nginx-1.12.2]# chkconfig nginx on

# 如果無法直接使用nginx命令,則表示/etc/init.d不在PATH變量內,可以通過修改/etc/profile來添加
  • 修改配置文件
[root@localhost nginx-1.12.2]# mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

[root@localhost nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
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;
        }    
    }
}
  • nginx配置文件檢測
[root@localhost nginx-1.12.2]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  • 啓動服務
[root@localhost nginx-1.12.2]# /etc/init.d/nginx start
  • 查看是否啓動成功
[root@localhost ~]# /etc/init.d/nginx start
Starting nginx (via systemctl):                            [  確定  ]

[root@localhost ~]# ps aux | grep nginx
root       1302  0.0  0.0  20500   628 ?        Ss   21:40   0:00nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody     1307  0.0  0.2  22944  3464 ?        S    21:40   0:00nginx: worker process
nobody     1308  0.0  0.2  22944  3212 ?        S    21:40   0:00nginx: worker process
root       2386  0.0  0.0 112680   976 pts/0    R+   21:42   0:00 grep --color=auto nginx

可能的錯誤

在配置自定義啓動腳本之前如果使用PREFIX/sbin/nginx啓動了腳本,那麼可能出現如下錯誤:

[root@localhost nginx-1.12.2]# nginx start
Starting nginx (via systemctl):  Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
                                                           [失敗]

解決方法是使用PREFIX/sbin/nginx -s stop先關閉nginx進程,然後使用自定義腳本啓動即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章