LNMP和Nginx详细配置
- 一、LNMP环境平台搭建
- 准备工作
- 源码软件包安装
- nginx
- mysql
- php
- 使用nginx连接php
- 二、web服务器-nginx
- 1.学nginx之前需要了解的知识
- 1.1 同步和异步(通知结果的方式)
- 1.2 阻塞和非阻塞(进线程等待时状态)
- 1.3 epoll模型
- 1.4 nginx为什么比其他web服务器能处理高并发请求(工作原理)
- 1.5 分布式
- 1.6 负载均衡
- 1.7 HTTP协议
- 2. Nginx详解
- 2.1 概述
- 2.2 工作模式
- 2.3 配置文件结构
- 3.nginx实验
- 实验1:nginx的状态统计
- 实验2:目录保护
- 实验3:基于IP访问控制
- 实验4:nginx的虚拟主机(基于域名)
- 实验5:nginx的反向代理
- 实验6:负载调度(负载均衡)
- 实验7:nginx实现https(证书+rewrite)
一、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