一、LNMP
- LNMP = Linux+Nginx+Mysql+PHP
- LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。Nginx中的PHP是以fastcgi的方式结合Nginx的,可以理解为Nginx代理了PHP的fastcgi。
- LNMP和LAMP唯一不同是:提供web服务的是Nginx而不是Apache。在Apache中,PHP是作为一个模块存在的。而在Nginx中,PHP是作为一个独立服务存在的,这个服务叫做php-fpm。Nginx直接处理静态请求,动态请求会转发给php-fpm。
二、LNMP的工作原理
- 浏览器发送http request请求到服务器(Nginx)
- 服务器响应并处理web请求,将一些静态资源(CSS,图片,视频等)保存服务器上,然后将php脚本通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给PHP-FPM(进程管理程序)
- PHP-FPM不做处理,然后调用PHP解析器进程,PHP解析器解析php脚本信息
- PHP解析器进程可以启动多个,进行并发执行,然后将解析后的脚本返回到PHP-FPM
- PHP-FPM再通过fast-cgi的形式将脚本信息传送给Nginx
- 服务器再通过Http response的形式传送给浏览器
- 浏览器再进行解析与渲染然后进行呈现
三、源码编译
1、MYSQL数据库的源码编译
- 解压安装 mysql:
tar zxf mysql-boost-5.7.28.tar.gz
- 创建 mysql 用户:
useradd -s /sbin/nologin -M mysql
- 编译MYSQL:
cmake跨平台工具是用来预编译mysql源码的,用于设置mysql的编译参数。如:安装目录、数据存放目录、字符编码、排序规则等。
yum install -y cmake ##编译mysql需要用的包
cd mysql-5.7.28 ##进入mysql解压后的目录
##编译:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql \ ##安装位置
> -DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock \ ##指定套接字文件位置
> -DEXTRA_CHARSETS=all \ ##扩展字符集
> -DDEFAULT_CHARSET=utf8 \ ##默认字符集
> -DDEFAULT_COLLATION=utf8_general_ci \ ##默认字符校对
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \ ##安装myisam 存储引擎
> -DWITH_MYISAM_STORAGE_ENGINE=1 \ ##安装innodb存储引擎
> -DWITH_MEMORY_STORAGE_ENGINE=1 \ ##安装memory存储引擎
> -DWITH_READLINE=1 \ ##支持readline库
> -DENABLED_LOCAL_INFILE=1 \ ##启用加载本地数据
> -DMYSQL_USER=mysql \ ##指定mysql运行用户
> -DMYSQL_TCP_PORT=3306 ##指定mysql端口
- 根据提示解决依赖性问题:
yum install -y gcc gcc-c++ ncurses-devel openssl-devel -y
- 安装:
make && make install
- 修改权限:
cd /usr/local/lnmp/mysql
mkdir data
chown -R root .
chown -R mysql data
ln -s /usr/local/lnmp/mysql/bin/* /usr/local/bin/
- 复制配置文件:
cd /usr/local/lnmp/mysql/mysql-test/include
cp default_my.cnf /etc/my.cnf
cd /usr/local/lnmp/mysql/support-files
cp -a mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig mysqld on
systemctl status mysqld
- 初始化:
mysqld --user=mysql --initialize ##以mysql 用户身份初始化
注意:
初始化会生成一个临时密码,用于登录 mysql(要记住此密码)
比如:
2019-01-03T09:06:09.448851Z 1 [Note] A temporary password is generated
for root@localhost: r##9VqAoA/au
r##9VqAoA/au
就是临时密码
- 启动进入mysql:
systemctl start mysqld
mysql -uroot -pr##9VqAoA/au: ##使用刚才的临时密码(会有报错,所以需要安全初始化)
- 安全初始化:
mysql_secure_installation ##然后会提示是否启用密码检测插件,直接回车不启用,否则会要求密码有大小写和特殊字符等要求。剩余全部选 y
2、PHP的源码编译
- 解压安装包:
tar zxf php-7.4.1.tar.gz
- 解决依赖性:
yum -y install bzip2
- 进入解压后的目录,开始编译:
./configure --prefix=/usr/local/lnmp/php --with-config-file-path=/usr/local/lnmp/php/etc \
--with-mysqli=/usr/local/lnmp/mysql/bin/mysql_config \
--enable-soap \
--enable-mbstring=all \
--enable-sockets \
--with-pdo-mysql=/usr/local/lnmp/mysql \
--enable-gd \
--without-pear \
--enable-fpm
- 根据编译过程中的报错逐步解决依赖性:
可能会需要安装的包:
yum install -y libxml2-devel
yum install -y libpng-devel
yum install -y oniguruma-*
- 安装:
make && make install
- 拷贝更改配置文件:
cd /usr/local/lnmp/php/etc
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
##修改
pid = run/php-fpm.pid
- 拷贝子配置文件:
cd /usr/local/lnmp/php/etc/php-fpm.d
cp www.conf.default www.conf
vim www.conf
##修改
user = nginx
group = nginx
- 拷贝更改php主配置文件:
cd php-7.4.1
cp php.ini-production /usr/local/lnmp/php/etc/php.ini
vim /usr/local/lnmp/php/etc/php.ini
##修改时区
date.timezone = Asia/Shanghai
- 拷贝php启动脚本至
/etc/init.d/
:
cd /root/lnmp/php-7.4.1/sapi/fpm
cp init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm ##添加执行权限
- 启动php:
/etc/init.d/php-fpm start
注意:
启动报错可能因为没有 nginx 用户,需要手动创建
useradd -u 900 nginx
3、Nginx的源码编译
- 解压安装包
tar zxf nginx-1.16.0.tar.gz
- 去掉Nginx的版本号:
cd /root/lnmp/nginx-1.16.0
vim src/core/nginx.h
##修改:
#define NGINX_VER "nginx/"(将此行末尾显示 nginx 版本号的配置删除)
- 关闭debug日至:
因为debug的日志非常多,企业中一般不需要开启。这样也可以减小Nginx占用的内存。
vim auto/cc/gcc
##修改:
# debug
#CFLAGS="$CFLAGS -g" (将这2行注释调,关闭debug)
- 编译安装 nginx:
./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --user=nginx --group=nginx
- 根据提示解决依赖性:
此处应该还需要安装pcre-devel
:
yum install pcre-devel -y
- 安装:
make && make install
- 修改nginx配置文件,开启php模块:
cd /usr/local/lnmp/nginx/conf
vim nginx.conf
##修改
user nginx nginx;
location / {
root html;
index index.php index.html index.htm; ##(添加 php 页面)
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
- 将Nginx启动脚本链接到
/usr/local/sbin/
:
ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
- 开启Nginx:
nginx -t ##检测语法
nginx
- 测试:
尝试访问http://172.25.254.51
可以访问到Nginx默认页面。
在Nginx默认发布目录添加index.php
:
vim /usr/local/lnmp/nginx/html/index.php
##写入:
<?php
phpinfo()
?>
刷新http://172.25.254.51
可以看到php的默认页面。