华子目录
nginx简介
概念
nginx
是一款轻量级http
服务器,也是一款邮箱代理服务器,同时具备反向代理,通用tcp/udp
代理的功能nginx
可以运行在x86、ARM
等多种平台上,同时支持Linux,Windows
等主流的操作系统
特点
- 支持高并发
- 单机
nginx
可支持十万级的并发连接,经过优化后可最高支持百万级并发连接
- 单机
- 内存资源消耗低
- 在同级web服务器中,
nginx
占用的内存最少,一万非活跃的http keep-alive连接仅消耗2.5M内存
- 在同级web服务器中,
- 高扩展性
- 和
apache
一样,nginx
采用模块化设计,并支持非常丰富的第三方模块
- 和
- 高可靠性
nginx
采用master-worker
模式,如果worker
出现故障,master
可以快速开启一个新的worker
来提供服务
nginx框架
-
主进程:
master
- 检查nginx配置是否正确
- 创建、监控
worker
进程的数量和状态 - 接收对
nginx
的管理指令,并作出对应操作
-
工作进程:
worker
- 处理客户端请求
- 接收
master
发来的指令,并做对应操作
-
-
注意:默认情况下,
nginx
会建立和服务器cpu
核心数相等的worker进程
,worker进程之间相互独立,若一个进程故障不会影响其他进程
nginx关键工作机制
- 抢占机制:当客户端发起请求时,会激活
accept_mutex
互斥锁,哪个worker
抢占了该互斥锁,该客户端的请求就由哪个worker
响应和处理 - 异步非阻塞模式:在传统事件处理模式下,如果所有的
worker
被客户端阻塞后,新来的客户就需要等待,直到原来的客户端释放worker后才能被处理请求。在异步非阻塞模式下,底层使用了linux的epol模型
,就算worker
被阻塞,新的客户端请求也会被正常处理
nginx正向代理功能
-
图:
-
-
分析:它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我,从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
-
理解:
- A租房人(客户端)想租C真实房东的房子,但不认识C真实房东(服务端)
- B房产中介(代理)认识C真实房东(服务端),并且从C真实房东(服务端)租到了房
- A租房人(客户端)通过B房产中介(代理)租到了C真实房东(服务端)的房
- C真实房东(服务端)只知道房子租给了B房产中介(代理),并不知道A租房人(客户端)租了自己的房子
-
结论:
正向代理
是一个位于客户端和原始服务器(origin server
)之间的服务器,为了从原始服务器取得内容,客户端
向代理
发送一个请求并指定目标(原始服务器)
,然后代理
向原始服务器
转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google
用ypn代理翻墙
去访问(用户知道要访问真正的服务器)
nginx反向代理功能
- 图:
- 分析:反向代理正好相反,它也是在客户端和服务器端的一个代理服务器,但是这个代理服务器的目的是用来保护服务器端的,当外网客户端来访问我们的服务器时为了避免暴露应用服务器的
实际ip地址
,我们会让客端访问代理服务器
,然后代理服务器
再根据客户端的请求去实际的应用服务器获取响应内容并返回客户端
nginx反向代理的工作流程
- 1.客户端向
Nginx
发送请求 - 2.
Nginx
在收到客户端发送的请求后,将请求转发到后端务器 - 3.后端服务器将客户端请求的资源回复给Nginx
- 4.Nginx将资源返回给客户端
代理本质
Nginx
反向代理通过位于location
中的proxy_pass
实现- 在反向代理的工作流程中,客户端向代理请求资源时使用的端口,可以和服务器提供服务的端口不一致
nginx负载均衡
Nginx
可以提供四层
和七层
的负载均衡Nginx
的负载均衡功能通过位于http
中的upstream
实现Nginx
提供了多种负载均衡算法,如轮询、权重等- 轮询算法下,
Nginx
会轮流将请求发送给不同的服务器,使每个服务器都均等的提供服务 - 权重算法下,
Nginx
会按照配置的权重比例,将请求发送给服务器。性能较好的服务器将提供更多的服务,性能较少的服务器将提供较少的服务
部署nginx
[root@server ~]# setenforce 0
[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl disable firewalld
[root@server ~]# yum install nginx -y
[root@server ~]# nginx -v #查看nginx版本,编译器,配置参数等信息
nginx version: nginx/1.20.1
[root@server ~]# systemctl start nginx
[root@server ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@server ~]# systemctl status nginx
[root@server ~]# ps -ef | grep nginx # 查看nginx进程
root 32436 1 0 13:49 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 32437 32436 0 13:49 ? 00:00:00 nginx: worker process
nginx 32438 32436 0 13:49 ? 00:00:00 nginx: worker process
root 32465 2807 0 13:49 pts/0 00:00:00 grep --color=auto nginx
[root@server ~]# netstat -lntup | grep nginx #查看nginx端口
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 32436/nginx: master
tcp6 0 0 :::80 :::* LISTEN 32436/nginx: master
常用命令
systemctl系列
[root@server ~]# systemctl start nginx #启动服务
[root@server ~]# systemctl restart nginx #重启服务
[root@server ~]# systemctl enable nginx #开机启动
[root@server ~]# systemctl stop nginx #停止服务
[root@server ~]# systemctl disable nginx #取消开机启动
[root@server ~]# systemctl status nginx #查看状态
nginx自带命令
[root@server ~]# nginx #启动nginx
[root@server ~]# nginx restart #重启服务
[root@server ~]# nginx -s reload #重新加载配置文件
[root@server ~]# nginx -s stop #强行停止服务
[root@server ~]# nginx -s quit #优雅停止服务,即所有请求处理完后退出服务
[root@server ~]# nginx -v #查看版本号
[root@server ~]# nginx -t #检查配置文件的语法是否错误,无错返回ok
nginx配置文件
[root@server ~]# cd /etc/nginx #服务目录
[root@server nginx]# tree
.
├── conf.d #子配置文件目录
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf #KOI8-R 编码(俄语)转换的映射文件
├── koi-win #KOI8-R 编码(俄语)转换的映射文件
├── mime.types #配置支持的媒体类型
├── mime.types.default #样例文件
├── nginx.conf #主配置文件
├── nginx.conf.default #样例文件
├── scgi_params
├── scgi_params.default
├── uwsgi_params
├── uwsgi_params.default
└── win-utf #KOI8-R 编码(俄语)转换的映射文件
网页默认目录:/usr/share/nginx/html
访问日志:/var/log/nginx/access.log
错误日志:/var/log/nginx/error.log
主配置文件/etc/nginx/nginx.conf
[root@server ~]# vim /etc/nginx/nginx.conf
内容结构
-
全局配置
- 运行用户
- worker数量
- 日志参数
- include导入的外部配置文件
-
性能配置
- 工作模式
- TCP连接数
-
http模块配置
- http请求和响应的参数
- 路由配置
- 虚拟主机配置
- 反向代理配置
- 负载均衡配置
模块分析
- 层级结构图
配置分析
# main配置段(全局配置)
user nginx; #运行的账户,默认即是nginx,可以不进行设置
worker_processes auto; #worker进程数,根据硬件调整,通常等于CPU数量或者2倍于CPU
error_log /var/log/nginx/error.log; #错误日志存放目录
pid /run/nginx.pid; #指定运行Nginx master主进程的pid文件存放路径
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf; #导入的外部文件位置
#events配置段,性能模块设置,其中可以设置时间处理模式等
events {
use epoll; #使用epo11事件驱动模型,但不推荐配置它,让nginx自己选择
worker_connections 1024; #每个进程的最大连接数量(并发数)
accept_mutex on #默认是off关闭的,这里推荐打开
}
#http配置段,包含全局块和server块,使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#以上定义日志格式
access_log /var/log/nginx/access.log main; #访问日志存储位置
sendfile on; #高效文件传输模式,默认开启
tcp_nopush on; #性能优化参数,数据是否立刻发送
tcp_nodelay on; #性能优化参数,小数据包是否延迟发送
keepalive_timeout 65; #超时时间
types_hash_max_size 4096; #性能优化参数,影响散列表的冲率
include /etc/nginx/mime.types; #可解析的静态资源类型
default_type application/octet-stream; #默认文件类型
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf; #加载子配置项
#server配置段,虚拟主机设置
server {
listen 80; #监听IPV4端口
listen [::]:80; #监昕IPV6端口
server_name _; #访问的域名
root /usr/share/nginx/html; #网页默认目录
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf; #子配置文件存储路径
#1ocation配置段,一般用来匹配不同的URI请求
location / {
root /usr/share/nginx/html; #相对路径网站根目录
alias /usr/share/nginx/html/; #绝对路径网站根目录
index index.html index.htm; #默认首页文件
deny 172.168.22.11; #禁止访问的ip地址,可以为a11
allow 172.168.33.44; #允许访问的ip地址,可以为a11
autoindex on; #开启目录文件列表
autoindex_exact_size on; #显示出文件的确切大小,单位是bytes
autoindex_localtime on; #显示的文件时间为文件的服务器时间
charset utf-8,gbk; #避免中文乱码
auth_basic "xxxx"; #加密网页验证时的提示信息
auth_basic_user_file /路径/文件名; #加密网页使用的密码验证文件
}
error_page 404 /404.html; #404时返回给客户端的页面
location = /404.html {
}
error_page 500 502 503 504 /50x.html; #50x错误返回给客户端的页面
location = /50x.html {
}
}
#https虚拟主机定义
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2; #监听的IPV4端口
# listen [::]:443 ssl http2;
# server_name _;
# root /usr/share/nginx/html; #网页默认目录
#
# ssl_certificate "/etc/pki/nginx/server.crt"; #证书存储路径
# ssl_certificate_key "/etc/pki/nginx/private/server.key"; #密钥存储
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
注意
server_name
指令一般用于指定虚拟主机的域名,在匹配时有以下四中写法:- 精确匹配:
server_name http://www.nginx.com;
- 左侧匹配:
server_name *.http://nginx.com;
- 右侧匹配:
server_name http://www.nginx.*;
- 正则匹配:
server_name ~^www.nginx.*$;
- 精确匹配:
- 注:匹配优先级:
精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
root
指令与alias
指令区别root
指令用于静态资源目录位置,它可以写在http、server、location
等配置中,root
指令定义的路径会与URI
叠加产生最终访问路径,如:
location /image {
root /opt/nginx/static;
}
#当用户访问www.test.com/image/1.png时,实际在服务器找的路径是/opt/nginx/static/image/1.png
alias
也是指定静态资源目录位置,但只能访问指定的绝对路径,不会叠加目录,只能写在location
中且末尾一定要添加/
,如:
location /image {
alias /opt/nginx/static/image/;
}
#当用户访问www.test.com/image/1.png时,实际在服务器找的路径是/opt/nginx/static/image/1.png
location
匹配路径- 格式:
location [ = | ~ | ~* | ^~ ] uri {
......
}
- 匹配规则:
=
精确匹配~
正则匹配,区分大小写~*
正则匹配,不区分大小写^~
匹配以某个字符串开头,不是正则匹配/
通用匹配,如果其他location
都没有匹配,则该location
会进行匹配
- 匹配优先级:
=
^~
~
~*
不带任何字符
示例
server {
listen 80;
server_name www.nginx-test.com;
#只用当访问www.nginx-test.com/match_all/ 时才会匹配到 /usr/share/nginx/html/match_all/index.html
location = /match_all/ {
root /usr/share/nginx/html;
index index.html;
}
#当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源
location ~ \.(jpeg|jpg|png|svg)$ {
root /usr/share/nginx/images;
}
#当访问www.nginx-test.com/bbs 时会匹配上 /usr/share/nginx/html/bbs/index.html
location ^~ /bbs/ {
root /usr/share/nginx/html;
index index.html index.htm;
}
#注意:上述location都找不到的话都在这里找
location / {
root html;
index index.html index.htm;
}
#其/不是根目录而是统统都匹配到指定路径,而指定路径为html,即nginx的默认网页目录/usr/share/nginx/html
}
uri
中的斜线,如;
location /test { #尾部无/
......
}
location /test/ { #尾部有/
......
}
- 不带
/
当访问http://www.nginx-test.com/test 时,nginx先找是否有test目录,如果有,则找test目录下的index.html;如果没有test目录,nginx则会找是否有test文件 - 带
/
当访问http://www.nginx-test.com/test 时,nginx先找是否有test目录,如果有则找test目录下的index.html,如果没有它也不会去找是否存在test文件
nginx.conf配置文件的语法规则
- 配置文件由
指令
与指令块
构成 - 每条指令以
;
分号结尾,指令与参数间以空格符号分隔
- 指令块以
{}
大括号将多条指令组织在一起 include
语句允许组合多个配置文件以提升可维护性- 通过
#
符号添加注释,提高可读性 - 通过
$
符号使用变量 - 部分指令的参数支持
正则表达式
,例如常用的location
指令
实验1:快速搭建网站
[root@server ~]# yum install nginx -y
[root@server ~]# systemctl start nginx
[root@server ~]# echo "welcome to www.openlab.com" > /usr/share/nginx/html/index.html #写入网页数据
#使用windows端进入访问
实验2:替换网页目录
[root@server ~]# yum install nginx -y
[root@server ~]# systemctl start nginx
[root@server ~]# mkdir -p /www/sxhkt #创建网页目录
#使用mobaxterm上传网页数据到/www/sxhkt中
[root@server ~]# cd /www/sxhkt
[root@server sxhkt]# ls
CSS img index.html js
[root@server sxhkt]# vim /etc/nginx/nginx.conf
#定位到42行,修改如下:
root /www/sxhkt;
[root@server sxhkt]# systemctl restart nginx
#测试:打开Windows端输入IP地址
实验3:搭建location板块的网站
[root@server ~]# yum install nginx -y
[root@server ~]# systemctl start nginx
[root@server ~]# mkdir -p /www/sxhkt #创建网页目录
#使用mobaxterm上传网页数据到/www/sxhkt中
[root@server ~]# cd /www/sxhkt
[root@server sxhkt]# ls
CSS img index.html js
[root@server sxhkt]# vim /etc/nginx/nginx.conf
#server板块中添加location板块
server{
listen 80;
listen [::]:80;
server_name _;
location / {
root /www/sxhkt;
index index.html index.htm;
}
}
[root@server sxhkt]# systemctl restart nginx
#测试:打开Windows端输入IP地址
实验4:搭建带有密码验证访问的网站数据列表
- 准备工作
[root@server ~]# setenforce 0
[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl disable firewalld
[root@server ~]# yum install nginx -y
[root@server ~]# yum install httpd-tools -y
[root@server ~]# systemctl start nginx
[root@server ~]# systemctl enable nginx
- 新建账户
[root@server ~]# useradd test1
[root@server ~]# useradd test2
[root@server ~]# passwd test1
更改用户 test1 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]# passwd test2
更改用户 test2 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
- 增加密码访问控制
htpasswd
[root@server ~]# htpasswd -c /etc/nginx/passwd test1
New password: #密码:12345
Re-type new password:
Adding password for user test1
[root@server ~]# htpasswd /etc/nginx/passwd test2
New password: #密码:12345
Re-type new password:
Adding password for user test2
# htpasswd:生成密码数据的命令
# -c:表示第一次生成,会创建存储密码的文件,第二次创建密码时不能增加-c参数,否则会覆盖
# /etc/httpd/passwd:存储访问网站的密码文件,passwd为文件名,名称可以自定义
# test1:需要验证密码访问的账户名称
- 开启访问网站时需要验证密码
[root@server ~]# vim /etc/nginx/nginx.conf
server {
listen 80;
listen [::]:80;
server_name _;
root /var/log; #数据列表
autoindex on; #开启访问网站时需要验证密码
auth_basic "请输入密码"; #提示语
auth_basic_user_file /etc/nginx/passwd; #对比的密码文件库
- 重启服务,测试
[root@server ~]# systemctl restart nginx
#windows打开浏览器输入IP地址,进行测试
- 输入用户名和密码