目录
绪论
1、nginx的主要功能
1.1 静态文件服务
1.2 反向代理
1.3 处理动态内容
1.4 实现SSL和TLS加密
1.5 虚拟主机
1.6 URL重定向
1.7 缓存功能
1.8 日志功能
2、nginx如何实现高并发
3、同步,异步,阻塞,非阻塞的概念补充
4、Nginx为什么不使用多线程?
5、实验
5.1 安装nginx服务
5.2 信号符
6、全局配置的六个模块简介
7、Nginx的四大模块
8、location常见配置指令,root、alias、proxy_pass(反向代理配置)
9、访问状态统计配置
10、基于IP地址的访问规则
11、虚拟主机,创建多个虚拟主机,基于一个服务器创建多个主页
12、虚拟IP地址创建
13、基于端口的虚拟主机
绪论
nginx:一款高性能、轻量级Web服务软件
特点:稳定性高,系统资源消耗低(处理http的并发能力高,单台物理服务器可支持30000~50000个并发请求。)
稳定:一般在企业中为了保持服务器的稳定,并发量都会设置在20000个左右
1、nginx的主要功能
1.1 静态文件服务
Nginx 可以直接提供静态文件的服务,例如 HTML、CSS、JavaScript、图像等。
它能够高效地处理并响应静态文件的请求。
1.2 反向代理
Nginx 可以作为反向代理服务器,将客户端的请求转发给后端的多个服务器。
它可以实现负载均衡、高可用性和故障转移,提供更好的性能和可靠性。
反向代理的核心:客户端请求时通过代理服务按照轮询算法转发到后台不同的服务器实现负载均衡和高可用
1.3 处理动态内容
Nginx可以与后端应用服务器(如 PHP-FPM、Node.js、Java 应用服务器等)配合使用,
实现动态内容的处理和执行。它可以代理动态请求,并将请求的结果返回给客户端。
1.4 实现SSL和TLS加密
可以实现SSL和TLS加密,就是HTTPS的加密方式,数字证书验证机制
1.5 虚拟主机
nginx可以在一台服务器上设置多个虚拟主机,同一个服务器上可以有多个域名和站点
1.6 URL重定向
Nginx 支持灵活的 URL 重写和重定向规则,可以对请求的 URL 进行修改和重定向,
实现 URL 的美化和重定向策略。
1.7 缓存功能
nginx自带缓存功能,可以缓存静态文件和动态内容,以减轻后端服务器的负载并提供更快的响应速度。
1.8 日志功能
可以详细的记录请求的信息,包括访问时间、请求路径、IP地址、响应状态等。有助于故障排查(系统控制的日志记录在/var/log/messages)(access.log:记录谁访问了我,都是访问成功的记录 error:记录访问失败的目录)
nginx的主要应用场景:tail -f /usr/local/nginx/logs/error.log
· 静态服务 · 反向代理,负载均衡 · 缓存服务 · 动态服务
2、nginx如何实现高并发
· nginx自身代码的问题,大量的底层代理进行了优化,用时子代理一个功能模块。epoll模块,支持高并发
· nginx也是采用一个master进程控制多个woker进程的模式。
master进程主要负责收集、分发请求。
每当一个请求过来时,master就拉起一个worker进程负责处理这个请求。
同时master进程负责收集和分发请求,worker是实际执行者。每个请求进来master就会拉起一个work进程处理请求,同时master进程也负责监控worker的状态,worker处理请求和cpu要一致或者是cpu的两倍。worker处理请求的过程中只受内存大小的限制,所以就可以处理多个请求,再加上nginx本身就是轻量级的服务,处理请求时占用很少内存,所以可以起到大并发处理的能力
3、同步,异步,阻塞,非阻塞的概念补充
同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,
这是一种可靠的服务序列。
要么成功都成功,失败都失败,服务的状态可以保持一致
异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,
此时该服务就算完成了。被依赖的服务是否最终完成无法确定,因此它是一个不可靠的服务序列。
阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,
函数只有在得到结果之后才会返回。
非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
4、Nginx为什么不使用多线程?
Apache: 创建多个进程或线程,而每个进程或线程都会为其分配 cpu 和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会耗光服务器资源。
Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。
5、实验
systemctl stop firewalld
setenforce 0
所有实验开始前关闭防火墙和安全机制
5.1 安装nginx服务
· 把nginx的安装包拖进来(/opt)
· 安装依赖包:
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
· 创建运行用户、组
(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
· 编译安装Nginx
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/
cd nginx-1.22.0/
./configure --prefix=/usr/local/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 -j 4 && make install使用这个命令而不是使用make && make install因为速度更快
· 修改权限
chown -R nginx.nginx /usr/local/nginx
· cd /usr/local/nginx/conf
解释:
· 让系统识别nginx的操作命令
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
注释:nginx常用命令
nginx -t 检查配置文件是否配置正确
nginx -v 查看nginx的版本号
nginx -s 向主进程传输信号,停止、开启、重启、重新加载
nginx -c 设置配置文件的默认路径
· 添加Nginx系统服务
vim /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=/usr/local/nginx/run/nginx.pid
· 创建目录
mkdir -p /usr/local/nginx/run/
· 修改配置文件
vim /usr/local/nginx/conf/nginx.conf
保运退出
· 重新加载配置
systemctl daemon-reload
chown -R nginx.nginx /usr/local/nginx
· 启动nginx
systemctl start nginx.service
5.2 信号符
信号符结合kill命令使用
kill -USR1 pid号:日志分割
kill -s HUP pid号:只要是kill只能跟pid号,重新加载
killall -s HUP nginx:可以跟服务名,也可以用pid号
kill -s QUIT pid号:优雅退出,有人访问的时候不会结束进程。访问完了才会结束进程
kill -s WINCH pid号:优雅地结束worker,直到请求完成才结worker进程
6、全局配置的六个模块简介
全局块:全局配置,对全局生效;
events块:配置影响 Nginx 服务器与用户的网络连接;
http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
location块:用于配置匹配的 uri ;
注意:location 匹配的内容来源是来自网页的URI,而不是URL(URL代表整个链接如:www.baidu.com/images/search,而URI则是/images/search。所以nginx的location匹配的是URI)
7、Nginx的四大模块
proxy、headers、upstream、stream模块
Proxy 模块:
proxy 模块是 Nginx 的核心模块之一,用于实现反向代理功能。
它允许将客户端的请求代理到后端的服务器,并将响应返回给客户端。
proxy 模块支持 HTTP、HTTPS、FastCGI、uWSGI、SCGI 等多种协议。
通过配置 proxy_pass 指令,可以指定代理的后端服务器地址。
Headers 模块:
headers 模块用于处理 HTTP 请求和响应的头部信息。它允许添加、修改或删除请求头和响应头,
实现对头部信息的定制化控制。headers 模块提供了一系列的指令,
如 add_header、set_header、more_set_headers 等,用于操作头部信息。
Upstream 模块:
upstream 模块用于配置反向代理服务器组(也称为上游服务器组)。
它定义了后端服务器的列表和相关的负载均衡策略,用于分发请求到后端服务器。
upstream 模块通过 upstream 块来配置后端服务器组,其中包括 server 指令用于定义后端服务器。
Stream 模块:
stream 模块是 Nginx 的流处理模块,用于处理 TCP 和 UDP 流量。
它提供了 TCP/UDP 代理、负载均衡、数据包过滤等功能。stream 模块通过 stream 块来配置流的处理规则,
可以根据目标地址和端口等条件进行流量的转发和处理。
8、location常见配置指令,root、alias、proxy_pass(反向代理配置)
ginx是通过alias设置虚拟目录,在nginx的配置中,alias目录和root目录是有区别的:
1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;
2)root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
3)使用alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/"符号!!
4)alias虚拟目录配置中,location匹配的path目录如果后面不带"/",那么访问的url地址中这个path目录后面加不加"/"不影响访问,访问时它会自动加上"/";
但是如果location匹配的path目录后面加上"/",那么访问的url地址中这个path目录必须要加上"/",访问时它不会自动加上"/"。如果不加上"/",访问就会失败!
5)root目录配置中,location匹配的path目录后面带不带"/",都不会影响访问。
其他区别:
1、 alias 只能作用在location中,而root可以存在server、http和location中。
2、 alias 后面必须要用 “/” 结束,否则会找不到文件,而 root 则对 ”/” 可有可无
小结:
#连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
Web服务的监听配置
server {
#监听地址及端口
listen 80;
#站点域名,可以有多个,用空格隔开
server name www.kgc.com;
#网页的默认字符集
charset utf-8;
#根目录配置
location / {
网站根目录的位置/usr/local/nginx/html
root html;
#内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
#错误页面配置
9、访问状态统计配置
yum -y install httpd-tools
htpasswd -c /usr/local/nginx/passwd.db lt
vim /usr/local/nginx/conf/nginx.conf
进入编辑:
http {
......前面省略,到下面
server {
listen 80;
server_name www.kgc.com;
charset utf-8;
location / {
root html;
index index.html index.php;
}
##添加 stub_status 配置##
location /status { #访问位置为/status
stub_status on; #打开状态统计功能
access_log off; #关闭此位置的日志记录
}
}
}
保存退出
systemctl restart nginx
到浏览器:20.0.0.30/status 统计连接状态
10、基于IP地址的访问规则
访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
systemctl restart nginx
curl 192.168.233.10
11、虚拟主机,创建多个虚拟主机,基于一个服务器创建多个主页
为虚拟主机准备网页文档
mkdir -p /var/www/html/kgc
mkdir -p /var/www/html/accp
echo "<h1>www.kgc.com</h1>" > /var/www/html/kgc/index.html
echo "<h1>www.accp.com</h1>" > /var/www/html/accp/index.html
修改Nginx的配置文件:
vim /usr/local/nginx/conf/nginx.conf
进入之后进行匹配修改添加
http {
......
server {
listen 80;
server_name www.kgc.com; #设置域名www.kgc.com
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /var/www/html/kgc; #设置www.kgc.com 的工作目录
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 80;
server_name www.accp.com; #设置域名www.accp.com
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
保存退出
systemctl restart nginx
进入虚拟机浏览器访问www.kgc.com www.accp.com
12、虚拟IP地址创建
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.233.21:80; #设置监听地址
server_name www.kgc.com;
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.233.33:80; #设置监听地址
server_name www.accp.com;
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
systemctl restart nginx
浏览器:192.168.233.33:80
13、基于端口的虚拟主机
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.233.21:8080; #设置监听 8080 端口
server_name www.kgc.com;
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.233.21:8888; #设置监听 8888 端口
server_name www.accp.com;
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
systemctl restart nginx