ngxin
一、什么是nginx
nginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡。
二、nginx如何处理请求
nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点listen 80; # 提供服务的端口,默认80server_name localhost; # 提供服务的域名主机名location / { # 第一个location区块开始root html; # 站点的根目录,相当于Nginx的安装目录index index.html index.htm; # 默认的首页文件,多个用空格分开} # 第一个location区块结果
三、说一下什么是正向代理和反向代理
正向代理:在客户端部署的一个代理服务器,类似于vpn
反向代理:在服务器端部署的一个代理服务器。
nginx反向代理优点:
占内存小,可实现高并发连接,处理响应快
可实现http服务器、虚拟主机、方向代理、负载均衡
nginx配置简单
可以不暴露正式的服务器IP地址
四、nginx的配置我呢见nginx.conf有哪些模块
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; # 提供服务的端口,默认80server_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.htmlroot html; # 指定对应的站点目录为html}} ......
五、配置nginx的动静分离
配置nginx的动静分离:假设我们有两台服务器,一台用于处理动态请求 IP 地址为192.168.1.100;另一台用于提供静态资源(如图片、CSS、JavaScript 文件等),IP 地址为192.168.1.101。
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的虚拟主机(区分内部网站与外部网站)
# 假设/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.comlocation / {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 |
#优先级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; }
九、如何实现反向代理和负载均衡
反向代理:
#使用proxy_pass指令将请求转发到后端服务器
server {listen 80;server_name example.com;location / {proxy_pass http://backend_server_ip:port;}
}
负载均衡
#使用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. 配置和编译 nginxsudo./configuresudo makesudo make install
5.进入sbin/nginx启动nginxcd /usr/local/nginx/sbinsudo./nginx
6. 重新加载配置文件sudo./nginx -s reload