黄金架构LNMP

LNMP是网站架构初期最合适的单体架构。因为初创型技术团队对于技术的选型,需要考虑如下因素

  1. 在创业初期,研发资源有限,研发人力有限,技术储备有限,需要选择一个易维护、简单的技术架构;
  2. 产品需要快速研发上线,并能够满足快速迭代要求,现实情况决定了一开始没有时间和精力来选择一个过于复杂的分布式架构系统,研发速度必须要快;
  3. 创业初期,业务复杂度比较低,业务量也比较小,如果选择过于复杂的架构,反而会增加研发难度以及运维难度;
  4. 遵从选择合适的技术而不是最好的技术原则,并权衡研发效率和产品目标,同时创业初期只有一个PHP研发人员,过于复杂的技术架构必然会带来比较高昂的学习成本。

基于如上的因素,LNMP架构就是最合适的。

如此架构,一般三台服务器足以,Nginx与后台系统部署在一台机器,Mysql数据库单独服务器,redis缓存一台服务器。

这样的架构优势在于

  • 单体架构,架构简单,清晰的分层结构;
  • 可以快速研发,满足产品快速迭代要求;
  • 没有复杂的技术,技术学习成本低,同时运维成本低,无需专业的运维(开发一般忙不过来,任何大小的公司,都至少得有一个运维,除非真的是一个很烂的小作坊),节省开支。

一、LNMP架构工作原理

1.nginx无法处理动态请求(需要编程语言去解析,PHP、python)
2.但是当用户发起动态请求时,nginx的location,进行规则判断,决定后续的动作
- 静态资源,直接返回(如读取nfs等资源)
- 动态资源,通过代理参数转发给后端框架。

二、LNMP架构原理

LNMP工作流是用户通过浏览器输入域名访问Nginx web服务,Nginx判断请求是静态请求则由Nginx返回给用户。

如果是动态请求(如.php结尾),那么Nginx会将该请求通过FastCGI接口发送给PHP引擎(php-fpm进程)进行解析。(在nginx的location中设置规则)

如果该动态请求需要读取mysql数据库,php会继续向后读取数据库,最终Nginx将获取的数据返回给用户。

nginx结合php工作原理

这张图中,设计到如下几个知识点,文字描述工作流程是

1.用户发起http请求,请求到达LNMP中的nginx

2.nginx根据用户请求的url进行判断,通过location进行匹配

3.locaiton判断出url是静态请求,nginx直接查找静态资源,返回响应。

4.location判断出是动态请求,nginx反向代理转发给后端(这个架构里是fastcgi的php)程序

5.nginx通过fastcgi_pass模块把请求转发给php-fpm进程,php-fpm进行后续的处理
(php-fpm进程调用wrapper进程) 6.如果请求是xx.php文件,那么php解释器直接阅读程序,完成php脚本任务,然后返回结果。 7.如果请求需要调用数据库,php则会通过代码连接数据库,发起SQL操作。 8.最终数据库的内容返回流程。
mysql

php

php-fpm

fastcgi

nginx

http

浏览器

fastcgi是什么

FastCGI是一个可伸缩、高速的在HTTP服务器和动态脚本之间通信的接口(在Linux环境下,FastCGI接口就是socket,这个socket可以是文件socket,也可以是IP socket。

也就意味着本地通信,远程通信两种,主要优点是把动态语言(用sock进程运行)和HTTP服务器(nginx)分离开。

  • 多数主流的web服务器都可接收、识别这个协议,如apache,nginx。
  • 同时诸多脚本编程语言也都实现了该协议,如php。
  • fastcgi接口,以c/s结构运行。

三、部署LNMP基础环境

1.创建www用户

降低nginx运行权限

[root@web-7 ~]#groupadd www -g 666
[root@web-7 ~]#useradd www -s /sbin/nologin -M -u 666 -g 666
[root@web-7 ~]#id www
uid=666(www) gid=666(www) groups=666(www)

2.官网nginx仓库

cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF

3.安装、开机启动

# 安装
yum clean all yum install nginx -y # 启动,开机自启
systemctl start nginx
systemctl enable nginx

4.部署php环境(配置yum源,第三方源)

# 卸载旧环境
yum remove php-mysql-5.4 php php-fpm php-common -y # 安装第三方epel源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install -y php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb php71w-json php71w-pecl-apcu php71w-pecl-apcu-devel

5.配置php-fpm和nginx用户一致

修改php-fpm配置文件
[root@web-7 ~]#sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
[root@web-7 ~]#sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf [root@web-7 ~]#grep -E '^(user|group)' /etc/php-fpm.d/www.conf
user = www
group = www

6.启动php-fpm开机自启

[root@web-7 ~]#systemctl start php-fpm
[root@web-7 ~]#
[root@web-7 ~]#systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
[root@web-7 ~]#

7.部署mysql(mariadb)

[root@web-7 ~]#yum install mariadb-server mariadb -y

[root@web-7 ~]#systemctl start mariadb

[root@web-7 ~]#
[root@web-7 ~]#systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@web-7 ~]#

8.mysql光速入门

1.修改密码,将默认的空密码,改为 "yuchaoit.cn"
[root@web-7 ~]#mysqladmin password 'yuchaoit.cn' 2.登录测试
[root@web-7 ~]#mysql -uroot -pyuchaoit.cn
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.68-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> 3.查看mysql默认的用户,查询默认mysql库下的user表,且只查看user,host两个字段
MariaDB [(none)]> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | web-7 |
| root | web-7 |
+------+-----------+
6 rows in set (0.00 sec) 4.指定账号、密码、服务端登录
[root@web-7 ~]#mysql -uroot -p'yuchaoit.cn' -h 127.0.0.1
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.68-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> 5.查看有多少库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec) 6.查看库下有多少张表,有24行记录,就是24张表
MariaDB [(none)]> show tables from mysql;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
24 rows in set (0.00 sec) 7.查看数据表中有多少个字段(查看表结构)
语法1,直接查看 "库.表"
MariaDB [(none)]> desc mysql.user; 语法2
切换数据库
MariaDB [(none)]> use mysql;
查看库下的表
MariaDB [mysql]> desc user;

四、LNMP环境架构部署

1.部署nginx支持fastcgi

fastcgi_pass 请求转发

官网文档
https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass Syntax: fastcgi_pass address;
Default: —
Context: location, if in location
Sets the address of a FastCGI server. The address can be specified as a domain name or IP address, and a port: 用法1,转发给ip:port形式
fastcgi_pass localhost:9000; 用法2,转发给unix socket本地进程套接字
fastcgi_pass unix:/tmp/fastcgi.socket;

设置fastcgi首页,需要结合fastcgi_param。

https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_index

语法
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;

2.具体配置参考

[root@web-7 /etc/nginx/conf.d]#cat php.conf
server{
listen 80;
server_name www.yuchaoit.cn;
# 静态请求,资源存放路径
root /www;
index index.php index.html; # 动态请求处理
location ~ \.php$ { root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

参数解释

参数文档

https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html

$document_root  就表示当前locatin设置的root或是alias的目录
SCRIPT_FILENAME 用于在php中确定脚本名字
fastcgi_script_name 请求的URL 整体意思是,用户发来的php相关请求,包括请求中的所有参数,全部转发给127.0.0.1:9000的php程序。

3.创建php程序目录

在上述配置中,用户的php请求,会转发给127.0.0.1:9000处理,并且去/code目录下寻找index.php

[root@web-7 ~]#mkdir -p /code
[root@web-7 ~]#chown -R www.www /code
[root@web-7 ~]#vim /code/test-phpinfo.php
[root@web-7 ~]#cat /code/test-phpinfo.php
<?php
phpinfo();
echo "welcome to yuchaoit.cn"
?>

4.检查nginx语法且启动

[root@web-7 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful 启动
[root@web-7 ~]# systemctl start nginx

5.绑定hosts访问php页面。

C:\Windows\System32\drivers\etc\hosts

10.0.0.7 www.yuchaoit.cn

访问页面,访问该php资源文件

www.yuchaoit.cn/test-phpinfo.php

6.测试php和数据库的连通。

先检查驱动是否正常,通过php-info页面,查看php的详细信息。

如果php,mysql不在同一台服务器,是需要修改配置文件,填入远程mysql的 ip:port。

代码测试连接。

[root@web-7 /code]#cat /code/mysql-test.php 

<?php

    $server="127.0.0.1";
$mysql_user="root";
$mysql_pwd="yuchaoit.cn"; // 创建数据库连接
$conn=mysqli_connect($server,$mysql_user,$mysql_pwd); // 检测连通性
if($conn){
echo "mysql successful by yuchaoit.cn \n";
}else {
die( "Connection failed: " . mysqli_connect_error());
} ?>

浏览器访问该php脚本试试。

最终的流程如下

五、部署知识社区网站

这里提供的开源php网站程序,基本都是静态文件和php文件放在了一起,因此nginx定义目录统一即可。

1.创建nginx虚拟主机

[root@web-7 /etc/nginx/conf.d]#cat wecenter.conf
server{
listen 80;
server_name wecenter.yuchaoit.cn; # 静态请求,资源存放路径
root /code/wecenter;
index index.php index.html; # 动态请求处理
location ~ \.php$ { root /code/wecenter;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

测试语法

[root@web-7 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web-7 /etc/nginx/conf.d]# 重启
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx

2.获取wecenter源码

1.下载地址
cd /code/wecenter && wget http://yuchaoit.cn/data/wecenter.zip [root@web-7 /code/wecenter]#ls /code/wecenter/wecenter.zip
/code/wecenter/wecenter.zip 2.解压缩,授权,进入php代码目录
[root@web-7 /code/wecenter]#unzip wecenter.zip 3.授权
[root@web-7 /code/wecenter]#chown -R www.www /code/

3.创建wecenter数据库

创建数据库,支持utf-8中文

MariaDB [(none)]> create database wecenter character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)

4.访问页面

新加了域名,就得做好解析
10.0.0.7 www.yuchaoit.cn wecenter.yuchaoit.cn

确保安装环境检查,全部是通过的。

填入数据库信息。

数据库导入成功后,可以进入数据库看看,是否生成了数据表。

mysql -uroot -pyuchaoit.cn
use wecenter;
show tables;

创建登录网站的管理员用户密码

yuchao01
chaoge666
yc_uuu@163.com

5.安装完毕后,删除安装程序

[root@web-7 /code/wecenter]#ls
app changelog.txt composer.lock install license.txt nginx.htaccess README.md static tmp vendor views
cache composer.json index.php language models plugins robots.txt system uploads version.php wecenter.zip 删除这个install安装目录即可
[root@web-7 /code/wecenter]#rm -rf install/

6.登录问答网站

7.可以在数据库中查询到用户信息。

MariaDB [wecenter]> select user_name,password from wecenter.aws_users;
+-----------+----------------------------------+
| user_name | password |
+-----------+----------------------------------+
| yuchao01 | 0fc98f3627b926536d42c02ecd8fae1f |
+-----------+----------------------------------+
1 row in set (0.00 sec)

六、部署wordpress

1.nginx环境搭建

1.创建虚拟主机文件
server{
listen 80;
server_name wordpress.yuchaoit.cn; # 静态请求,资源存放路径
root /code/wordpress;
index index.php index.html; # 动态请求处理
location ~ \.php$ { root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
} 2.重启nginx
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx 3.下载wordpress代码
mkdir -p /code/wordpress ; cd /code/wordpress ; wget https://cn.wordpress.org/latest-zh_CN.zip 解压缩
[root@web-7 /code/wordpress]#unzip latest-zh_CN.zip
[root@web-7 /code/wordpress]#mv wordpress/* . 授权
[root@web-7 /code/wordpress]#chown -R www.www /code/ 4.创建数据库
[root@web-7 /code/wordpress]#mysql -uroot -pyuchaoit.cn
MariaDB [(none)]> create database wordpress;
Query OK, 1 row affected (0.00 sec)

2.客户端访问

dns解析
10.0.0.7 www.yuchaoit.cn wecenter.yuchaoit.cn wordpress.yuchaoit.cn http://wordpress.yuchaoit.cn/ 运行信息
yuchao01
chaoge666

3.发表新文章

4.检查数据库

[root@web-7 /code/wordpress]#!mysql
mysql -uroot -pyuchaoit.cn
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 148
Server version: 5.5.68-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wecenter |
| wordpress |
+--------------------+
6 rows in set (0.00 sec) MariaDB [(none)]> 查看数据表
MariaDB [wordpress]> show tables; 查看文章表
MariaDB [wordpress]> desc wp_posts; 查看文章数据
MariaDB [wordpress]> select post_content from wp_posts;

LNMP单机架构的更多相关文章

  1. LNMP + Apache 架构配置

    从事前端开发已3年有余,越来越发现前端开发要学习的知识已不仅仅是html+css+js那么简单了,2017年市场上就有了大前端的概念,可以说对前端工程师的要求也越来越高了,从招聘的要求中可以看到熟悉一 ...

  2. LNMP WEB架构构建

    LNMP WEB架构处理请求过程 1.Nginx为一款高性能Web服务器,本身是不能处理PHP的,当接收到客户端浏览器发送HTTP Request请求时,Nginx服务器响应并处理web请求,静态资源 ...

  3. 自动化kolla-ansible部署centos7.9+openstack-train-超融合单机架构

    自动化kolla-ansible部署centos7.9+openstack-train-超融合单机架构   欢迎加QQ群:1026880196 进行交流学习 环境说明: 1. 满足一台电脑一个网卡的环 ...

  4. 九.LNMP网站架构实践部署

    期中集群架构-第九章-期中架构LNMP章节====================================================================== 01. LNMP ...

  5. LNMP+Redis架构部署

    工作机制 L(Linux)N(Nginx)M(Mysql)P(PHP)架构想必大家都知道,LNMP架构主要作用是让前端服务与后端存储以及后端的一下服务进行连接起来,来实现php程序的动态请求. 而今天 ...

  6. keepalived+nginx+lnmp 网站架构

    <网站架构演变技术研究> 项目实施手册 2019年8月2日 第一章:  实验环境确认 4 1.1-1.系统版本 4 1.1-2.内核参数 4 1.1-3.主机网络参数设置 4 1-1-4 ...

  7. centos7编译安装LNMP服务架构

    CentOS7.4 源码编译安装LNMP  1.基于CentOS7.4源码编译安装得lnmp 系统环境CentOS 7.4 系统最小化安装,只安装了一些常用包(vim.lirzs.gcc*.wget. ...

  8. Docker下部署LNMP黄金架构

    一.部署lnmp 1.网络规划 172.16.10.0/24nginx:172.16.10.10mysql:172.16.10.20php:172.16.10.30网站访问主目录:/wwwrootng ...

  9. 四十三、LAMP与LNMP web架构深度优化实战-第二部

    1. 配置nginx gzip压缩功能    服务器对发出的内容进行压缩,带宽少了,体验好,速度快,但是服务端压,会使cpu使用高,压缩比高的进行压缩:文本.程序文件.数据文件.图片视频不要压缩,一般 ...

  10. 四十二、LAMP与LNMP web架构深度优化实战-第一部

    1.nginx.conf配置文件基本参数优化 1.1 隐藏nginx header内版本号信息 一些特定的系统及服务漏洞一般都和特定的软件版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称及版本等信 ...

随机推荐

  1. Dragonfly 基于 P2P 的文件和镜像分发系统

    简介: 业界软件生态在优化 HTTPS 的性能上也做了诸多探索,传统的软件优化方案在软件层面的优化无法满足流量日益增长的速度,CPU 硬件加速成为业界一个通用的解决方案. 作者:孙景文.吴迪   背景 ...

  2. e签宝:借助钉钉宜搭变革传统项目管理模式,交付效率显著提升

    ​简介:通过钉钉宜搭,e签宝在半个月内搭建了项目交付管理平台,提升了项目管理的效率和质量,推进了团队核心业务的信息化建设.e签宝在有效梳理了各环节的工作进度.质量.成本.职权后,通过宜搭平台保障了内外 ...

  3. 基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析

    简介: 针对VPC FlowLog的五元组和捕获窗口信息,在分析时使用不同时间窗口精度,可能得到不一样的流量特征,本文介绍一种方法将原始采集日志的时间窗口做拆分,之后重新聚合为新的日志做分析,达到更细 ...

  4. [Py] Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work

    当通过常规命令安装 pip install pydot 和 brew install graphviz 之后,在代码中 import pydot 依旧不生效. 比如:在 tensorflow 使用 t ...

  5. openpyxl模块操作Excel

    1.openpyxl模块了解 1.excel版本问题 03版本之前的excel文件后缀名xls 03版本之后的excel文件后缀名xlsx 2.python操作excel表格的模块 openpyxl ...

  6. jemeter中json提取器

    1.A接口中的单个参数提取,之后用于其他接口 a. 在需要提取字段的接口上右击添加----后置处理器-----json extractor b. 填写json提取器的数据 1.名称:随便填写,方便自己 ...

  7. Linux部署Apache 网站服务器(httpd服务)

    一.项目导入: 某学院组建了校园网,建设了学院网站.现需要架设Web服务器来为学院网站安家,同时在网站上传和更新时,需要用到文件上传和下载,因此还要架设FTP服务器,为学院内部和互联网用户提供WWW. ...

  8. 🔥httpsok-v1.8.1 一分钟搞定SSL证书自动续期

    httpsok-v1.8.1 一分钟搞定SSL证书自动续期 简介 一行命令,一分钟轻松搞定SSL证书自动续期 httpsok 是一个便捷的 HTTPS 证书自动续签工具,专为 Nginx 服务器设计. ...

  9. leaflet 使用高德地图实例

    let map = L.map("mapid", { minZoom: 10, maxZoom: 15, center: [37.005646, 114.52044], zoom: ...

  10. LLM实战:LLM微调加速神器-Unsloth + LLama3

    1. 背景 五一结束后,本qiang~又投入了LLM的技术海洋中,本期将给大家带来LLM微调神器:Unsloth. 正如Unsloth官方的对外宣贯:Easily finetune & tra ...