搭建LNMP环境实现高并发请求

一、LNMP环境平台搭建

准备工作

使用centos7系统并关闭SELinux和firewalld防火墙(老生常谈了)

配置华为镜像云网络源

更新内核版本(yum update)

安装编译工具和和依赖软件包

yum -y install gcc gcc-c++ pcre-devel openssl openssl-devel zlib-devel ncurses-devel cmake bison libxml2-devel libpng-devel

准备Nginx(1.8)、mysql(5.56)、php(7.4.33)三大源码包

源码软件包安装

nginx

1.使用tar -xvf直接解压即可

2.创建用于运行nginx的用户

useradd -r -s /sbin/nologin nginx
echo “/sbin/nologin” >> /etc/shells

3.预编译定义nginx选项

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
mysql

1.使用tar -xvf直接解压即可

2.创建mysql用户

useradd -r -s /sbin/nologin mysql

3.预编译并且安装mysql

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306

make && make install
ln -s /usr/local/mysql/bin/*  /usr/local/bin

4.生成配置文件

 cp -a /mysql-5.5.62/support-files/my-medium.cnf  /etc/my.cnf

5.初始化授权表

 cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql

6.生成Mysql的启动和自启动管理脚本

#切换到mysql的源码解压缩目录下的support-files
cd /lnmp/mysql-5.5.62/support-files
cp -a mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld

chkconfig --add mysqld
chkconfig mysqld on
service mysqld start|stop|restart

7.给mysql的root用户设置密码

mysqladmin -uroot password 123456
php

1.使用tar -xvf直接解压即可

2.预编译选项并且安装

./configure --prefix=/usr/local/php/ --with-config-file-path=/usr/local/php/etc/ --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-soap --enable-mbstring=all --enable-sockets --with-pdo-mysql=/usr/local/mysql --with-gd --without-pear --enable-fpm

make && make install

3.生成php配置文件

cp -a /lnmp/php-7.1.29/php.ini-production /usr/local/php/etc/php.ini

4.创建软连接,使用php相关命令是更方便

ln -s /usr/local/php/bin/* /usr/local/bin/
ln -s /usr/local/php/sbin/* /usr/local/sbin/
使用nginx连接php

1.使用nginx连接php先启动php-fpm

cd /usr/local/php/etc/
#生成php-fpm的配置文件,并修改指定参数
cp -a php-fpm.conf.default php-fpm.conf

#修改指定条目的参数:
vim php-fpm.conf
pid = run/php-fpm.pid

cd /usr/local/php/etc/php-fpm.d/
cp -a www.conf.default www.conf
vim www.conf
#修改用户和组的指定用户
	user = nginx
	group = nginx

2.修改Nginx的配置文件,使其识别.php后缀的文件

vim /usr/local/nginx/conf/nginx.conf
#取消下列行的注释,并修改include选项的后缀为fastcgi.conf,并注意每一行结尾的分号和大括号
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_params;		#修改为fastcgi.conf
}

注意:有些网站项目开发时,目录和页面结构不相同,重新定义正则匹配

案例:location ~ .php(/.*)*$

该结构适用于typecho博客项目,可以匹配出"http://192.168.88.110/blog/index.php/archives/1/"

二、web服务器-nginx

1.学nginx之前需要了解的知识

1.1 同步和异步(通知结果的方式)
同步:当一个同步请求调用消息发出之后,调用者要一直等待调用的结果通知后,才能进行后续的操作执行
异步:当一个异步请求调用消息发出之后,调用者不必一直等待调用的结果返回,异步请求调用消息,想要得到结果,一般有两种方式
1.主动轮循异步调用的结果
2.被调用通过callback(回调函数)来通知调用者的调用结果

同步与异步的区别在于消息通知的方法上,也就是调用结果的通知方式不同

1.2 阻塞和非阻塞(进线程等待时状态)
阻塞:请求调用消息在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活 
非阻塞:请求调用消息在发出去后,不会阻塞当前进/线程,而会立即返回。

阻塞和非阻塞的区别在于(进程/线程)等待消息 时候的行为,也就是在等待消息的时候,当前(进程/线程)是挂起状态还是非挂起状态

同步异步和阻塞非阻塞的四种组合

  • 同步阻塞 :客户端在向服务端发送调用消息,客户端需要等待服务端的返回消息结果。在这个返回的过程中,进线程会被挂起,只有返回消息返回到客户端,进线程才会被激活。(apache就是该模式)
  • 同步非阻塞:客户端在向服务端发送调用消息,客户端需要等待服务端的返回消息结果。在这个返回的过程中,不会阻塞当前进线程,返回消息会立即返回客户端。
  • 异步阻塞:客户端在向服务端发送调用消息,客户端不需要一直等待服务端的返回消息结果。在这个返回的过程中,进线程会被挂起,只有返回消息返回到客户端,进线程才会被激活。
  • 异步非阻塞:客户端在向服务端发送调用消息,客户端不需要一直等待服务端的返回消息结果。在这个返回的过程中,不会阻塞当前进线程,返回消息会立即返回客户端。(nginx就是该模式)
	大部分程序的I/O模型都是同步阻塞的,单个进程每次只在一个文件描述符上执行I/O操作,每次I/O系统调用都会阻塞,直到完成数据传输。传统的服务器采用的就是同步阻塞的多进程模型。一个server采用一个进程负责一个request的方式,一个进程负责一个request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是有限的,且进程数越多,调度的开销也越大,因此无法面对高并发。
1.3 epoll模型

当连接有I/O事件产生的时候,epoll就会去告诉进程哪个连接有I/O事件产生,然后进程就去处理这个事件。

1.4 nginx为什么比其他web服务器能处理高并发请求(工作原理)
	nginx配置了epoll模型,使用异步非阻塞方式工作,可以轻轻松松完成百万计的并发连接。
	每次有用户请求消息,就会有一个worker进程去处理。worker只会处理到可能会发生阻塞的进程。
	举个例子,客户端向服务端发送请求信息,并等待请求返回。那么当前进行处理的worker进程,不会干等着,客户端发送完请求后,他会把这个请求注册成一个事件(如果服务端返回消息了,请告诉我,我接着继续工作)。
	如果再有新的请求消息,接着秉承着这种工作方法处理请求。一旦服务端返回消息,就会触发事件,worker就快速回来接手。这个request就会一直往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

在这里插入图片描述

1.5 分布式

​ 同一项任务有多个不同的步骤协同完成的服务器构建方式

1.6 负载均衡

​ 同一类有多个服务彼此分摊压力的服务器构建方式。结合调度器

1.7 HTTP协议

​ 超文本传输协议

​ http1.1 数据传输的过程将所有的数据一起传输

​ http2 数据传输的时候将数据进行分流管理(分成图片文件、php文件、html文件等),提高处理数据效率

​ http3 支持udp传输

#使用http2在nginx中开启功能:
http2 on;  #在server模块中添加,http2需要在加密的基础上实现

2. Nginx详解

2.1 概述

​ Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协。议下发行。其特点是内存利用率高,并发能力强。

2.2 工作模式

nginx有两种工作模式:master-worker模式和单进程模式。

master-worker模式

nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式。

使用master-worker模式的优点:

1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

单进程模式(了解即可):

单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。

2.3 配置文件结构
user  www www;
#程序运行用户和组
worker_processes auto;
#启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目
error_log  /home/wwwlogs/nginx_error.log  crit;
#全局错误日志
pid        /usr/local/nginx/logs/nginx.pid;
#主进程PID保存文件
worker_rlimit_nofile 51200;
#文件描述符数量
events 
	{
  	use epoll; 
	#使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
	worker_connections 51200;	 
	#工作进程的最大连接数量
	}
http{
	#网站优化参数
	server {						#具体的某一网站的配置信息
		listen 80;					#监听端口
		root html;					#网页根目录(/usr/local/nginx/html)
		server_name www.kernel.com;		#服务器域名
		index index.html;			#默认加载页面
		access_log logs/access.log;	#访问日志保存位置
		......;
		location (.*)\.php$ {
			用正则匹配具体的访问对象;
		}
		location {
			跳转等规则;
		}
	}
	server {
		虚拟主机;
	}
}

3.nginx实验

实验1:nginx的状态统计

1.预编译nginx的时候使用–with-http_stub_status_module,将该模块开启

2.修改nginx的主配置文件(写入要访问的server标签)

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location /tongji{
	stub_status on;
	access_log  off;
	}

3.客户端访问网址IP/tongji

在这里插入图片描述

"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数

实验2:目录保护

继续上面的步骤继续实验

在线状态统计的location中添加

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
auth_basic "Welcome to nginx_status!";
auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;

使用apache的命令htpsswd进行用户密码文件的创建

yum -y install httpd		#需要先安装apache
htpasswd -c /usr/local/nginx/html/htpasswd.nginx user
#将密码文件生成到指定的目录

重启nginx

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost ~]# /usr/local/nginx/sbin/nginx

实验结果

在这里插入图片描述

实验3:基于IP访问控制

接着上面的实验完成操作

在线状态统计的localtion添加

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
allow 192.168.88.1;
deny 192.168.88.0/24;

重启nginx

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost ~]# /usr/local/nginx/sbin/nginx
实验4:nginx的虚拟主机(基于域名)

1.提前准备两个网站域名,并且规划了两个网站网页存放目录,并且设置好权限

www.first.com(/use/local/nginx/html/one) www.second.com(/use/local/nginx/html/two)

2.在nginx主配置文件中编写两个server标签,并且写好各自信息

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
    server{
        listen  80;
        server_name www.first.com;
        index index.html;
        root html/one;
        access_log logs/one-access.log main;
   }

   server{
        listen  80;
        server_name www.second.com;
        index index.html;
        root html/two;
        access_log logs/one-access.log main;
   }

3.重启nginx

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost ~]# /usr/local/nginx/sbin/nginx

4.分别访问两个不同的域名验证结果(需要把域名和ip地址加到本机hosts文件中)

在这里插入图片描述

在这里插入图片描述

实验5:nginx的反向代理

正向代理:是一个位于客户端和原始服务器之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个请求并指定目录,然后代理向原始服务器转交请求并获得内容返回给客户端

在这里插入图片描述

反向代理:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,及用户直接访问代理服务器就可以获得目标服务器之间的资源,反向代理服务器负责将请求转发给目标服务器。

用户不需要知道目标服务器的ip地址,也无需在用户端做任何决定

在这里插入图片描述

实验步骤

1.在另一台机器安装apache,启动并编写页面

2.编写nginx的主配置文件在server标签内添加

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

location / {
  proxy_pass http://192.168.99.135:80;#此处填写apache服务器的IP地址
}

3.重启nginx

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost ~]# /usr/local/nginx/sbin/nginx

启动之前原页面

在这里插入图片描述

启动之后现在页面

在这里插入图片描述

实验6:负载调度(负载均衡)

负载均衡:就是将任务分摊到多个操作单元上进行执行,例如web服务器、FTP服务器、企业关键应用服务器和其他关键任务服务器等,从而共同完成工作任务

实验步骤

1.使用默认的rr轮询算法,修改nginx配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
# 负载均衡模块
upstream aas{
        server 192.168.99.135:80;
        server 192.168.99.145:80;
   }
   server{
        location / {
           proxy_pass http://aas;  #添加反向代理。代理地址写aas和上面的轮询标签一致
           proxy_set_header Host $host;#重写请求头部保证网站所有页面都可以访问成功
        }
   }

2.开启并设置两台主机(99.135和99.145)

安装apache,并设置不同的网页内容来完成实验效果

3.重启nginx,使用客户端进行测试

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost ~]# /usr/local/nginx/sbin/nginx

#刷新网站页面就可以实现两个网页来回轮询

扩展补充:wrr算法实现加强轮询

upstream aas {
	server 192.168.88.100:80 weight=1;
	server 192.168.88.200:80 weight=2;
}
实验7:nginx实现https(证书+rewrite)

实验步骤

1.预编译nginx,需要将–with-http_ssl_module 模块开启

2.在对应要进行加密的server标签中添加以下内容开启SSL

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
        listen       443 ssl;
        server_name  www.second.com;
        ssl on;             #开启ssl加密
        ssl_certificate     /usr/local/nginx/conf/ssl/tt.crt;
        ssl_certificate_key  /usr/local/nginx/conf/ssl/tt.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html/two;
            index  index.html index.htm;
        }
    }

3.生成证书密钥文件

[root@localhost ~]# cd /usr/local/nginx/conf
[root@localhost conf]# mkdir ssl
[root@localhost conf]# cd ssl
[root@localhost ssl]# openssl genrsa -out tt.key 1024
[root@localhost ssl]# openssl req -new -key tt.key -out tt.csr
[root@localhost ssl]# openssl x509 -req -days 365 -sha256 -in tt.csr -signkey tt.key -out tt.crt

4.设置http自动跳转https功能

#在刚才的加密ssl模块server上面加以下内容 
server {
        listen  80;
        server_name  www.second.com;
        rewrite  ^(.*)$  https://www.second.com$1 permanent;
    #直接跳转到https://www.second.com ,permanent是永久跳转的意思测试的时候不建议使用,容易造成误判
        location / {
            root   html/two;
            index  index.html index.htm;
        }
   }

5.重启nginx,并测试

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost ~]# /usr/local/nginx/sbin/nginx
  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值