LNMP网站架构
前言
LNMP网站架构是早期Linux系统开始流行时最火热的架构,至今还有很多公司仍在使用。其中L代表Linux操作系统,表示整个网站运行的环境;N代表Nginx,表示静态元素处理等;M代表Mysql数据库,P代表php,也就是php开发的程序,用于动态处理请求。
LNMP动态网站部署
ngx_fastcgi_modul # nginx通过ngx_fastcgi_modul模块 链接 php-fpm处理动态请求。
环境:
192.168.93.136 node-1
192.168.93.137 node-2
192.168.93.138 node-3
-
在node-1节点 部署nginx 作为web服务器
yum -y install nginx
-
在node-3节点 部署 php 作为中间件 (源码包部署php省略)
yum -y install php-fpm php-mysql php-gd # php-fpm接受动态请求 php-mysql链接mysql程序 php-gd图形库程序 systemctl restart php-fpm netstat -anpt | grep 9000 # 查看php是否开启 默认端口是9000 vim /html/liang.php # php页面 <?php # 测试代码 显示一切主机信息 phpinfo(); ?> **(1) 本地fastcgi** vim /etc/nginx/conf.d/liang.conf # 配置虚拟主机 server{ listen 8080; server_name [web.liang.com](http://web.liang.com); location /{ access_log /var/log/nginx/liang.access.log main; index liang.php liang.html; } location ~ \.php$ { root /html; # 网站源码主目录 fastcgi_pass 127.0.0.1:9000; # 本地fastcgi fastcgi_index liang.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 定位网站源码代码 include fastcgi_params; } } **(2) 远程fastcgi 分布式fastcgi** nginx:192.168.93.136 php:192.168.93.138 vim /etc/nginx/conf.d/liang.conf # 配置虚拟主机 server{ listen 80; server_name [web.liang.com](http://web.liang.com); access_log /var/log/access_liang.log main; error_log /var/log/error_liang.log; location /{ root /usr/share/nginx/html; index liang.html; } location ~ \.php$ { root /opt/php; # 远端php-fpm服务器的路径 fastcgi_pass 192.168.93.138:9000; # 远端fastcgi fastcgi_index liang.php; fastcgi_param SCRIPT_FILENAME /opt/php/$fastcgi_script_name; # /opt/php远端机器目录 存放网站源码 include fastcgi_params; } }
访问 192.168.93.136:8080 如果出现网站则成功
如果本地的php可以使用 但是远程的主机php不可用 访问网站返回502 或者 file not found在node-3(部署php的主机)上vim /etc/php-fpm.d/www.conf listen = 127.0.0.1:9000 改为 listen = 192.168.93.138:9000 # 监听本ip端口 listen.allowed_clients = 192.168.93.136 # 允许nginx访问 # 将php页面源码放在 fastcgi_param 定义的位置 如:/opt/php/liang.php -> fastcgi机器目录 systemctl restart php-fpm # 重启服务
-
在node-2节点 部署mysql服务
mysql> create database php; # 创建数据库 mysql> grant all on php.* to php@'192.168.93.136' identified by '123'; # 创建用户并授权 ip为web服务器ip mysql> flush privileges; vim /html/test_mysql.php # 编写连接数据库源码 <?php $link=mysql_connect('192.168.93.137','php','123'); # 连接数据库 if ($link) echo "Successfully"; else echo "Faile"; mysql_close(); ?
如果是用远端的php 则在数据库授权的时候也应该加上远程主机ip 是php去请求数据库,不然会报错 并且将文件拷贝到远端php服务器
-
网站上线
(1)下载网站源码包
wget [https://cn.wordpress.org/wordpress-4.9.1-zh_CN.zip](https://cn.wordpress.org/wordpress-4.9.1-zh_CN.zip)
(2)解压源码包
unzip wordpress-4.9.1-zh_CN.zip
(3)准备源码目录
mkdir /work mv /root/wordpress/* /work
(4)目录授权
chown -R nginx.nginx /word
(5)测试
访问192.168.93.136:8080
虚拟主机:
server{ listen 8080; server_name web.liang.com; location /{ access_log /var/log/nginx/liang.access.log main; root /word; index index.php index.html; } location ~ \.php$ { root /word; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass 192.168.93.138:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
-
前端后端交互
html├── insert.html
├── insert.php
└── select.php
(1)编写html文件
vim insert.html <html> <body> <form action="insert.php" method="post"> Firstname: <input type="text" name="firstname" /> Lastname: <input type="text" name="lastname" /> Age: <input type="text" name="age" /> <input type="submit" /> </form> </body> </html>
(2)编写写入数据的php中间件
vim insert.php <?php $con = mysql_connect("192.168.93.137","ll","123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); $sql="INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } echo "1 record added"; mysql_close($con) ?>
(3)在mysql节点准备数据库和表
mysql> create database my_db; mysql> create table my_db.Persons (FirstName varchar(50), LastName varchar(50),Age int);
(4)访问insert.html页面 看看数据是否插入成功
(5)编写查询的数据的php中间件
vim select.php <?php $con = mysql_connect("192.168.93.137","ll","123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM Persons"); echo "<table border='1'> <tr> <th>Firstname</th> <th>Lastname</th> </tr>"; while($row = mysql_fetch_array($result)) { echo "<tr>"; echo "<td>" . $row['FirstName'] . "</td>"; echo "<td>" . $row['LastName'] . "</td>"; echo "</tr>"; } echo "</table>"; mysql_close($con); ?>
(6)访问: 192.168.93.136:8080/select.php
php-fpm相关配置及优化
-
核心配置文件
vim /etc/php.ini date.timezone = PRC # 设置时区
-
全局配置文件
vim /etc/php-fpm.conf /run/php-fpm/php-fpm.pid # 设置pid文件的位置 error_log = log/php-fpm.log # 记录错误日志的文件 log_level = notice # 记录日志的等级 process.max = 128 # 控制最大进程数 daemonize = yes # 将fpm转至后台运行
-
扩展配置文件(优化参数运维关注)
vim /etc/php-fpm.d/www.conf user = apache group = apache # 设置用户和组 listen = 127.0.0.1:9000 # php程序监听端口 slowlog = /var/log/php-fpm/$pool-slow.log # 启动慢日志 pm=dynamic # 动态模式开启 start_servers=5 # 最初开启的进程 min_spare_server =5 # 最小空闲进程数 max_spare_servers=10 # 最大空闲进程数 防止大规模断开后 闲置很多进程 max_children # 最大进程数 # 数值取决于你的服务器内存。 假设你打算给10G内存给当前配置的PHP-FPM # 一般一个PHP请求占用内存10M-40M,我们按站点每个PHP请求占用内存25M,这样max_children = 10G/25M = 409 max_requests # 每个子进程处理的请求数量 # 默认值为unlimited(默认为1024),可以设置小一点(如500左右),这样可以避免内存泄露带来的问题
-
php监控页面
vim /etc/php-fpm.d/www.conf pm.status_path = /php_status # 开启 vim /etc/nginx/conf.d/default.conf location = /php_status { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; include fastcgi_params; } systemctl restart nginx 访问测试