一、什么是nginx
nginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡。
二、nginx如何处理请求
nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址
yaml
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
三、说一下什么是正向代理和反向代理
正向代理:在客户端部署的一个代理服务器,类似于vpn
反向代理:在服务器端部署的一个代理服务器。
nginx反向代理优点:
占内存小,可实现高并发连接,处理响应快
可实现http服务器、虚拟主机、方向代理、负载均衡
nginx配置简单
可以不暴露正式的服务器IP地址
四、nginx的配置我呢见nginx.conf有哪些模块
yaml
worker_processes 1; # worker进程的数量
events { # 事件区块开始
worker_connections 1024; # 每个worker进程支持的最大连接数
} # 事件区块结束
http { # HTTP区块开始
include mime.types; # Nginx支持的媒体类型库文件
default_type application/octet-stream; # 默认的媒体类型
sendfile on; # 开启高效传输模式
keepalive_timeout 65; # 连接超时
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
error_page 500502503504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html; # 指定对应的站点目录为html
}
}
......
五、配置nginx的动静分离
配置nginx的动静分离:假设我们有两台服务器,一台用于处理动态请求 IP 地址为192.168.1.100;另一台用于提供静态资源(如图片、CSS、JavaScript 文件等),IP 地址为192.168.1.101。
shell
http {
#... other configurations...
upstream dynamic_servers {
server 192.168.1.100:80;
}
upstream static_servers {
server 192.168.1.101:80;
}
server {
listen 80;
server_name your_domain_name;
location / {
proxy_pass http://dynamic_servers;
}
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
proxy_pass http://static_servers;
}
}
}
六、配置nginx的虚拟主机(区分内部网站与外部网站)
shell
# 假设/var/www/example1;是内网 /var/www/example2:81;是外网
http {
#... other configurations...
server {
listen 80; listen 8080;
server_name example1.com; server_name example.com;
location / {
root /var/www/example1;
}
}
server {
listen 80; listen 80;
server_name example2.com; server_name example.com
location / {
root /var/www/example2; proxy_pass http://127.0.0.1:8080
}
}
}
#当你在浏览器中输入example1.com:80时访问的是内网网址;访问example2.com时,访问的是外网网址。
#如果你的服务器没有绑定这些域名,可以通过修改本地的hosts文件
#(在 Windows 系统中位于C:\Windows\System32\drivers\etc\hosts,在 Linux 和 macOS 系统中位于/etc/hosts),
#添加以下内容来模拟域名访问:
127.0.0.1 example1.com
127.0.0.1 example2.com
七、location的用法
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 以某个字符串开头 | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
!~ | 区分大小写不匹配的正则 | 5 |
!~* | 不区分大小写不匹配的正则 | 6 |
/ | 通用匹配,任何请求都会匹配到 | 7 |
shell
#优先级1,精确匹配,根路径
location =/ {
return 400;
}
#优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
location ^~ /av {
root /data/av/;
}
#优先级3,区分大小写的正则匹配,匹配/media*****路径
location ~ /media {
alias /data/static/;
}
#优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
#优先7,通用匹配
location / {
return 403;
}
八、nginx负载均衡的算法有哪些
1 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。
upstream backserver {
server 192.168.0.12;
server 192.168.0.13;
}
2 权重 weight
weight的值越大分到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。
其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
}
3 ip_hash( IP绑定)
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题
upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}
4 fair(第三方插件)
必须安装upstream_fair模块。
对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
哪个服务器的响应速度快,就将请求分配到那个服务器上。
5、url_hash(第三方插件)
必须安装Nginx的hash软件包
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
九、如何实现反向代理和负载均衡
反向代理:
shell
#使用proxy_pass指令将请求转发到后端服务器
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server_ip:port;
}
}
负载均衡
shell
#使用upstream指令定义后端服务器组,然后在location中使用proxy_pass指向该服务器组。例如:
upstream backend_servers {
server server1_ip:port;
server server2_ip:port;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
}
}
十、如何根据服务器的cpu核心数来配置适当的worker进程
1.确定服务器的 CPU 核心数:
cat /proc/cpuinfo | grep "processor" | wc -l
2.修改 Nginx 配置文件(nginx.conf):
找到worker_processes指令,设置其值为合适的进程数。例如,如果服务器有 4 个 CPU 核心,可以设置为:
worker_processes 4;
3.检查配置并重启 Nginx:
使用以下命令检查 Nginx 配置文件的语法正确性:
nginx -t
如果配置正确,重启 Nginx 使配置生效:
sudo systemctl restart nginx
十一、对 Nginx 性能优化的方法有哪些?
1.调整 worker 进程数:根据服务器的 CPU 核心数来设置适当的 worker 进程数。
2.优化连接参数:如设置keepalive_timeout来保持长连接,减少连接建立和关闭的开销。
keepalive_timeout指令有两个参数:
第一个参数指定了客户端与服务器保持连接的超时时间。如果在这个时间内没有新的请求,连接将被关闭。
第二个参数(可选)指定了在响应一个请求后,保持连接在服务端等待下一个请求的超时时间。
例如:
keepalive_timeout 65;表示客户端连接超时时间为 65 秒,服务端等待下一个请求的超时时间默认为同客户端连接超时时间。
keepalive_timeout 65 5;表示客户端连接超时时间为 65 秒,服务端等待下一个请求的超时时间为 5 秒。
场景分析:
2.1.如果是高并发的 Web 应用,如在线购物网站、社交媒体平台等,较长的连接超时时间可以减少连接建立的开销,提高性能。
2.2.如果网络延迟较高,可能需要设置较长的超时时间,以避免频繁地关闭和重新建立连接。
2.3如果服务器负载较高,较短的超时时间可以确保连接及时释放,避免资源耗尽。
建议设置
一般情况下,从一个适中的值开始,如keepalive_timeout 60;(60 秒)。
通过性能测试和监控来观察连接的使用情况和服务器的性能指标。
如果发现连接频繁建立和关闭,可以适当延长超时时间。
如果服务器资源紧张,可以考虑缩短超时时间。
对于移动应用或网络不稳定的环境,可以设置相对较长的超时时间,以适应网络波动。例如keepalive_timeout 90;。
对于内部网络或低延迟环境,可以设置较短的超时时间,如keepalive_timeout 30;。
3.启用缓存:对于静态资源可以启用缓存,提高响应速度。
方法1:在 Nginx 配置文件(通常是nginx.conf)中,找到处理静态资源的location块。在这个location块中添加expires指令来设置缓存时间:
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires 7d;
}
例如,设置缓存时间为 7 这里的7d表示 7 天,可以根据实际需求调整缓存时间。
方法2:开启文件缓存
Nginx 可以利用操作系统的文件缓存来提高静态资源的访问速度。在http块中添加以下指令:
http {
#...
open_file_cache max=1000 inactive=60s;
open_file_cache_valid 80s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
#...
}
这些指令的含义如下:
open_file_cache max=1000 inactive=60s:设置文件缓存的最大数量为 1000,并且如果一个文件在 60 秒内没有被访问,就从缓存中移除。
open_file_cache_valid 80s:设置缓存验证的时间为 80 秒。在这个时间内,如果文件没有被修改,就继续使用缓存中的内容。
open_file_cache_min_uses 2:设置一个文件至少被访问 2 次才会被缓存。
open_file_cache_errors on:当打开文件出现错误时,也将错误信息缓存起来,以便下次快速返回错误信息,而不是再次尝试打开文件。
十二、如果 Nginx 无法启动,你会从哪些方面进行排查?
1.检查配置文件是否正确,语法是否有错误。可以使用nginx -t命令进行语法检查。
2.查看日志文件,logs/error.log通常会记录启动过程中的错误信息。
3.检查端口是否被占用,如果 Nginx 尝试监听的端口已经被其他程序占用,将无法启动。
4.检查 Nginx 进程是否已经在运行,如果有残留的 Nginx 进程,可能会导致新的启动失败。
十三、当 Nginx 出现高负载时,你该如何处理?
1.检查后端服务器的状态,是否有服务器出现故障或性能问题。
2.分析访问日志,确定哪些请求导致了高负载,是否有异常的请求模式。
3.调整负载均衡策略,如增加后端服务器数量、调整权重等。
4.考虑优化 Nginx 的配置,如增加缓存、调整连接参数等。
十四、centos如何安装部署nginx
1.安装依赖 gcc
sudo yum install gcc pcre-devel zlib-devel
2.下载nginx安装包
sudo wget http://nginx.org/download/nginx-1.24.0.tar.gz
3.解压
4. 配置和编译 nginx
sudo./configure
sudo make
sudo make install
5.进入sbin/nginx启动nginx
cd /usr/local/nginx/sbin
sudo./nginx
6. 重新加载配置文件
sudo./nginx -s reload