目录
一.Nginx是什么?
1.Nginx概述
2.Nginx模块与作用
3.Nginx三大作用:反向代理、负载均衡、动静分离
二.Nginx和Apache的差异
三.安装Nginx
1.编译安装
2.yum安装
四.Nginx的信号使用
五.Nginx的核心配置指令
1.访问状态统计配置
2.基于授权的访问控制
3.基于客户端访问控制
4.基于域名的nginx虚拟主机
5.基于IP的nginx虚拟主机
6.基于端口的nginx虚拟主机
Nginx(发音同"engine x")是一个高性能的反向代理和 Web服务器软件,最初是由俄罗斯人 Igor Sysoev开发的。Nginx 的第一个版本发布于2004年,其源代码基于双条款 BSD许可证发布,因其系统资源消耗低、运行稳定且具有高性能的并发处理能力等特性,Nginx 在互联网企业中得到广泛应用。Nginx 是互联网上最受欢迎的开源 Web 服务器之一,它不仅提供了用于开发和交付的一整套应用技术,还是应用交付领域的开源领导者。
2019年 3月,著名硬件负载均衡厂商F5宣布收购 Nginx,Nginx成为F5的一部分。 F5表示,将加强对开源和 Nginx 应用平台的投资,致力于Nginx 开源技术、开发人员和社区的发展,更大的投资将为开放源码计划注人新的活力,会主办更多的开放源码活动,并产生更多的开放源码内容。
main模块:全局配置模块,所有模块都要执行遵守
配置运行nginx服务器的用户(组)、worker_process数(进程)、nginx进程PID存放路径、错误日志存放路径、配置文件的引入等
stream服务模块:实现反向代理功能,包括TCP协议代理
邮件服务模块:主要用于支持 Nginx 的邮件服务
对 POP3 协议、 IMAP 协议和 SMTP协议的支持
第三方模块:二次开发,为了扩展 Nginx 服务器应用,完成开发者自定义功能
Json 支持、 Lua 支持等
events模块:影响nginx服务器与用户的网络连接
events { #events模块设置
woker_connections 65536; #设置单个工作进程最大并发连接数
use epoll; #事件驱动类型选择为epoll
accept_mutex on; #同一时刻一个请求轮流由work进程除了,即轮询
multi_accept on; #每个工作进程同时接受多个网络连接
}
http模块:跟web服务相关,主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,包含几个子模块
自定义服务日志、允许sendfile方式传输文件、连接超时时间、单连接请求数上限、Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
location模块:uri网址定位
server模块:服务模块
配置80端口监听、虚拟主机、DNS域名解析等
auth_basic模块:对网页设置用户名密码
gzip模块:压缩
proxy模块:设置后端IP地址、端口号及http和加密的https
ssl模块:https加密
反向代理:在服务端 配置,客户端 访问服务器A ,服务器A 为代理服务器 ,将客户服务再转发到服务器B
作用:缓存,将服务器的响应缓存在自己的内存中,减少服务器压力;
负载均衡,将用户请求分配给多个服务器;
访问控制
正向代理:在客户端 配置,配置完了再去访问具体服务,即代理服务器 代理了客户端 ,再去和目标服务器 进行交互
作用:提高访问速度
隐藏客户端真实IP地址
负载均衡:分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务
nginx七层负载均衡调度算法(六种)
1、轮询(默认调度算法)
特点:每个请求按时间顺序逐一分配到不同的后端服务器处理。
适用业务场景:后端服务器硬件性能配置完全一致,业务无特殊要求时使用。upstream backendserver {
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}
2、加权轮询特点:指定轮询几率,weight值(权重)和访问比例成正比,用户请求按权重比例分配。
适用业务场景:用于后端服务器硬件性处理能力不平均的情形。upstream backendserver {
server 192.168.0.14:80 weight=5 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 weight=10 max_fails=2 fail_timeout=10s;
}
3、ip_hash(IP哈希)特点:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session会话保持问题。
适用业务场景:适用于需要账号登录的系统,会话连接保持的业务。upstream backendserver {
ip_hash;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}
4、最少连接数 least_conn特点:按nginx反向代理与后端服务器之间的连接数,连接数最少的优先分配。
适用业务场景:适用于客户端与后端服务器需要保持长连接的业务。
upstream backendserver {
least_conn; server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}5、响应时间 fair(需编译安装第三方模块 ngx_http_upstream_fair_module)
特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
适用业务场景:对访问响应速度有一定要求的业务。upstream backendserver {
fair;
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
}6、url_hash(URL分配 )(需编译安装第三方模块 ngx_http_upstream_hash_module)
特点:按访问url的hash结果来分配请求,使同一个url访问到同一个后端服务器。
适用业务场景:适用于后端服务器为缓存服务器时比较有效。
upstream backendserver {
server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
hash $request_uri;
}
动静分离:采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。
在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式,通过使用Nginx提高网站的响应速度,优化用户体验
Apache:同步多进程模型:一个连接对应一个进程(高稳定)
1.rewrite更强大(rewrite主要功能是实现统一资源定位符URL的跳转)
2.模块多,基本想到的都可以找到
3.少bug,更加稳定(nginx相对较多)
4.PHP支持比较简单(nginx需要配合其他后端用)
5.处理动态请求更有优势(nginx更适合静态与反向)
Nginx:异步非阻塞模型:多个连接(万级别)对应一个进程(高性能)
1.轻量级,采用C编写,占用更少的内存与资源
2.抗并发/高并发,以epoll and kqueue 作为开发模型,负载能力高,高并发下能够保持 低资源低消耗高性能(apache在PHP处理慢或前端压力很大时,容易出现进程数飙升 从而拒绝服务)
3.处理静态文件好,静态处理性能比apache高三倍以上
4.设计高度模块化,编写模块相对简单
5.配置简洁,正则配置更简单,且更改完可以使用 -t 测试(apache配置复杂,重启时发 现出错,会很崩溃)
6.作为负载均衡服务器,支持七层负载均衡,可以有效防止ddos攻击
7.本身是一个反向代理服务器,也可以作为邮件代理服务器使用
8.支持热部署,支持在线升级
关闭防火墙,将安装nginx所需软件包传到/opt目录下
nginx安装官网:https://nginx.org/en/download.html
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
# 将压缩包传入到/opt目录下
cd /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz
安装依赖包
#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些安装的开发包,以便提供相应的库和头文件
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
编译安装nginx
tar xf nginx-1.18.0.tar.gz
cd nginx-1.18.0/
mkdir /apps/nginx -p
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
make -j2 && make install
chown -R nginx.nginx /apps/nginx
创建软连接后直接 nginx启动
ln -s /apps/nginx/sbin/nginx /usr/sbin/
创建Nginx 自启动文件
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
重新加载配置、设置开机自启并开启服务
systemctl daemon-reload #重新加载配置
systemctl enable --now nginx #开机自启并立即启动
systemctl status nginx.service #查看服务状态(验证
Centos7 需要安装epel源
cd /etc/yum.repos.d
vim epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
gpgcheck=0
yum install -y epel-release
yum install nginx -y
nginx 命令支持向其发送信号,实现不同功能
nginx -h
#查询nginx信号使用规则
常用信号:
信号 | 解释 |
nginx -v | 显示版本 |
nginx -V | 显示编译详细情况、模块等信息 |
nginx -t | 检查语法格式 |
nginx -T | 打印当前配置 |
nginx -s | 发送信号 |
nginx -s stop | 立即关闭 |
nginx -s quit | 优雅退出,不影响业务的状态下退出 |
nginx -s reload | 重新加载配置文件 |
nginx -s USR1 | 分割日志 |
nginx -s USR2 | 优雅升级 |
nginx -g 'user zhangsan;' | 以张三身份运行,默认是以nginx身份 |
nginx -g 'daemon off;' | 前台运行命令 |
第一步:查看已安装的 Nginx 是否包含http_stub_status模块
cd /usr/local/nginx/sbin
#根据安装路径自由修改/apps/nginx/sbin也可
nginx -V
第二步:修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置(修改之前进行备份)
cd /usr/local/nginx/conf/ #/apps/nginx/conf同理
cp nginx.conf nginx.conf.bak #备份
vim nginx.conf
server {
listen 80;
server_name www.clj.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
##添加 stub_status 配置
location /status { ##访问位置为/status
stub_status on; ##打开状态统计功能
access_log off; ##关闭此位置的日志记录
}
第三步:重启服务后进行访问测试
systemctl restart nginx.service
浏览器访问 http;//192.168.79.210/status
Active connections ∶ 表示当前的活动连接数;
server accepts handled requests∶表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数已处理的请求数。
可curl http∶//192.168.79.210/status 结合 awk与if 语句进行性能监控。
第一步:生成用户密码认证文件
yum install -y httpd-tools
#安装工具
htpasswd -c /usr/local/nginx/passwd.db zhangsan
#生成用户密码认证文件(注意路径
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db
#修改属性和赋予执行权限
第二步:修改主配置文件相应的目录,添加认真配置
vim /usr/local/nginx/conf/nginx.conf
#路径/apps/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
#添加认证配置
auth_basic "secret"; #设置密码提示框文字信息
auth_basic_user_file /usr/local/nginx/passwd.db;
}
第三步:检查错误,重启服务,访问测试
nginx -t
systemctl restart nginx.service
curl 192.168.79.210
访问控制规则如下:
deny IP/IP段:拒绝某个IP或IP段的客户端访问。
allow IP/IP段:允许某个IP或IP段的客户端访问。
规则从上往下执行,如果匹配到则停止,不会再往下继续匹配。
第一步:在主配置文件中添加控制规则
vim /usr/local/nginx/conf/nginx.conf
#注意路径/apps/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
# 添加控制规则
deny 192.168.80.77; #拒绝访问的客户端IP
allow all; #允许其他所有客户端访问
}
第二步:重启服务
systemctl restart nginx.service
第三步:被拒绝的客户端访问测试
192.168.79.220访问
curl 192.168.79.210
第四步:其他客户端访问测试
192.168.79.210访问
curl 192.168.79.210
192.168.79.230访问
curl 192.168.79.210
第一步:为虚拟主机提供域名和IP的映射
echo "192.168.79.210 www.zhuo.com www.xunizhuo.com" >> /etc/hosts
第二步:为虚拟主机准备网页文档
mkdir -p /var/www/html/zhuo/
mkdir -p /var/www/html/xunizhuo/
echo "www.zhuo.com
" > /var/www/html/zhuo/index.html
echo "www.xunizhuo.com
" > /var/www/html/xunizhuo/index.html
第三步:还原nginx主配置文件
之前做过访问控制,所以直接将备份配置进行还原
cd /usr/local/nginx/conf #/apps/nginx/conf路径同理
cp nginx.conf.bak nginx.conf #还原主配置文件
第四步:修改主配置文件
vim /usr/local/nginx/conf/nginx.conf
#/apps/nginx/conf/nginx.conf同理
server {
listen 80;
server_name www.xunizhuo.com; #设置域名
charset utf-8; #设置网页字符集
access_log logs/xunizhuo.com.access.log; #设置日志名
location / {
root /var/www/html/xunizhuo; #设置www.bxb.com的工作目录
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.zhuo.com; #设置域名
charset utf-8; #设置网页字符集
access_log logs/zhuo.com.access.log; #设置日志名
location / {
root /var/www/html/zhuo; #设置www.bxb.com的工作目录
index index.html index.htm;
}
第五步:重启nginx后进行访问测试
systemctl restart nginx.service
curl www.zhuo.com
curl www.xunizhuo.com
第一步:添加虚拟网卡,修改主配置文件
ifconfig ens33:0 192.168.79.211/24
vim /usr/local/nginx/conf/nginx.conf
#/apps/nginx/conf/nginx.conf同理
server {
listen 192.168.79.210:80; #修改监听的为ip
server_name www.xunizhuo.com;
charset utf-8;
access_log logs/xunizhuo.com.access.log;
location / {
root /var/www/html/xunizhuo;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 192.168.79.211:80; #修改监听的为ip
server_name www.zhuo.com;
charset utf-8;
access_log logs/zhuo.com.access.log;
location / {
root /var/www/html/zhuo;
index index.html index.htm;
}
第二步:检查配置文件,重启服务
nginx -t
systemctl restart nginx.service
第三步:客户端上访问测试
curl 192.168.79.210:80
curl 192.168.79.211:80
第一步:修改主配置文件
vim /usr/local/nginx/conf/nginx.conf
#/apps/nginx/conf/nginx.conf同理
server {
listen 192.168.79.210:666; #修改监听的为ip的666端口
server_name www.xunizhuo.com;
charset utf-8;
access_log logs/xunizhuo.com.access.log;
location / {
root /var/www/html/xunizhuo;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 192.168.79.211:888; #修改监听的为ip的888端口
server_name www.zhuo.com;
charset utf-8;
access_log logs/zhuo.com.access.log;
location / {
root /var/www/html/zhuo;
index index.html index.htm;
}
第二步:检查配置文件,重启服务
nginx -t
systemctl restart nginx.service
第三步:客户端上访问测试
curl 192.168.79.210:666
curl 192.168.79.211:888