内容摘要
- LNMP架构介绍
- MySQL安装
- PHP安装
- Nginx介绍
- Nginx安装
一、LNMP架构介绍
- LNMP和LAMP不同的是,提供web服务的是Nginx
- 并且php是作为一个独立服务存在的,这个服务叫做php-fpm
- Nginx直接处理静态请求,动态请求会转发给php-fpm
- Nginx在处理静态文件时比Apache更快
二、Mysql的安装
MySQL常用的安装方法:rpm、源码(与一般的源码包稍有不同,可以查看相关的文档)、二进制的免编译(无需配置编译),mysql常用的两个引擎:innodb、myisam。
- 首先移至: cd /usr/local/src/ 目录下
- 下载MySQL的二进制免编译包: wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz (失效后,可前往r.aminglinux.com找最新的下载地址)
- 解压文件: tar -zxvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
- 移动解压目录并更名: mv mysql-5.6.39-linux-glibc2.12-x86_64 /usr/local/mysql
- 移动至mysql目录下: cd /usr/local/mysql
- 创建一个新用户:useradd mysql
- 创建datadir的目录: mkdir /data/
- 初始化mysql,指定用户和data目录:./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
- 需要的依赖包: perl-DBD-MySQL
- 将mysql自带的配置文件移至系统配置目录下,并修改配置文件,指定datadir的目录,以及socket的目录: cp support-files/my-default.cnf /etc/my.cnf (系统默认自带有my.cnf文件)
- 将mysql自带的脚本文件移至chkconfig的执行目录下,并定义basedir(程序目录)和datadir: cp support-files/mysql.server /etc/init.d/mysqld
- 将脚本文件的权限更改为755(一般默认为755):chmod 755 /etc/init.d/mysqld
- 将脚本文件加入到chkconfig服务中: chkconfig --add mysqld
- 使用命令 /etc/init.d/mysqld start 或 service start mysqld 启动服务,如图:
- 如果没有启动脚本的模板时,可以使用命令行的方法启动进程:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/data/mysql & 指定mysqld_safe的路径,配置文件,用户以及datadir的路径,再使用&符号丢至后台。该方式启动的mysql服务,只能通过 killall mysqld (该命令相对kill更加安全)命令来结束。
三、PHP安装
在LAMP架构中,php是做为apache的一个模块存在的,而在LNMP架构中,php是作为一个单独的服务存在,所以安装方式及参数有些许差别。
- 相关的依赖包:yum -y install libxml2-devel libpng-devel openssl openssl-devel bzip2 bzip2-devel libjpeg-devel freetype-devel libmcrypt.x86_64 libmcrypt-devel.x86_64 curl curl-devel
- 移动至/usr/local/src
- wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2
- 解压源码包: tar -jxvf php-5.6.32.tar.bz2
- 新建php-fpm用户:useradd -s /sbin/nologin php-fpm
- 移至解压后的cd php-5.6.32目录下执行命令: ./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 (若之前已经编译过该源码包,先使用命令make clean清除编译参数等在执行该命令)
- 最后进行编译和安装: make && make install
- 复制解压后的源码包中的配置模板到php-fpm目录下:cp php.ini-production /usr/local/php-fpm/etc/php.ini (配置文件的目录时在编译时--with-config-file-path=所定义的目录位置)
- 创建文件/usr/local/php-fpm/etc/php-fpm.conf,加入以下内容(参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/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
listen.mode = 666
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
- 复制解压后的源码包中的启动脚本:cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpmd
- 修改启动脚本权限:chmod 755 /etc/init.d/php-fpmd
- 将脚本文件加入到chkconfig服务中: chkconfig --add php-fpmd
- 设置启动:chkconfig php-fpmd on
- 查看配置文件是否正确: /usr/local/php-fpm/sbin/php-fpm -t (与/usr/local/php-fpm/bin/php的用法基本一致)
- 启动php-fpm服务:service php-fpmd start
- 测试服务是否启动成功:ps aux |grep php-fpm
四、Nginx介绍
- Nginx官网 nginx.org,最新版1.15,最新稳定版1.14(截止2018年9月)
- Nginx应用场景:web服务、反向代理、负载均衡
- Nginx著名分支,淘宝基于Nginx开发的Tengine,使用上和Nginx一致,服务名,配置文件名都一样,和Nginx的最大区别在于Tenging增加了一些定制化模块,在安全限速方面表现突出,另外它支持对js,css合并
- Nginx核心+lua相关的组件和模块组成了一个支持lua的高性能web容器openresty,参考http://jinnianshilongnian.iteye.com/blog/2280928
- Nginx做为HTTP服务器,有以下几项基本特性:
- 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
- 无缓存的反向代理加速,简单的负载均衡和容错.
- FastCGI,简单的负载均衡和容错.
- 模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
- 支持SSL 和 TLSSNI.
- 高并发响应性能非常好,官方测试Nginx处理静态文件并发5w/s
- 反向代理性能非常强。(可用于负载均衡)
- 内存和 cpu 占用率低。(为 Apache 的 1/5-1/10)
- 对后端服务有健康检查功能。
- 支持 PHP cgi 方式和 fastcgi 方式。
- 配置代码简洁且容易上手。
五、Nginx安装
- 移动至目录/usr/local/src
- 下载最新稳定版Nginx1.14版本:wget http://nginx.org/download/nginx-1.14.0.tar.gz
- 解压源码包:tar zxvf nginx-1.14.0.tar.gz
- 移至解压后的cd nginx-1.14.0目录下执行命令:./configure --prefix=/usr/local/nginx
- 编译安装:make && make install
- 创建编辑启动脚本.vim /etc/init.d/nginx,增加内容如下:(参考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/etc_init.d_nginx#L1)
#!/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
- 修改启动脚本权限:chmod 755 /etc/init.d/nginx
- 将脚本文件加入到chkconfig服务中: chkconfig --add nginx
- 设置启动:chkconfig nginx on
- 启动脚本:service nginx start
- 新建nginx配置文件(/usr/local/nginx/conf/),原有的备份一下:mv nginx.conf nginx.conf.bak
- 创建nginx配置文件(/usr/local/nginx/conf/),增加内容如下:(参考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D15Z/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;
}
}
}
- 检查配置文件是否正确:/usr/local/nginx/sbin/nginx -t
- 使用命令curl localhost测试,如图:
- 测试PHP解析,使用命令curl localhost/1.php:
- 无法解析PHP时,可能与nginx配置文件中定义的user和group有关。
六、扩展
- Nginx为什么比Apache Httpd高效:原理篇
- http://www.toxingwang.com/linux-unix/linux-basic/1712.html
- https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/IO.md?public=true
- https://www.zhihu.com/question/64727674
- apache和nginx工作原理比较:http://www.server110.com/nginx/201402/6543.html
- 概念了解:CGI,FastCGI,PHP-CGI与PHPFPM:https://www.awaimai.com/371.html