ngxin

一、什么是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
相关推荐
BLEACH-heiqiyihu9 小时前
红帽9中nginx-源码编译php
运维·nginx·php
这个需求建议不做10 小时前
vue3打包配置 vite、router、nginx配置
前端·nginx·vue
&星辰入梦来&11 小时前
Nginx从入门到入土(三): 静态资源管理与代理服务
运维·nginx·负载均衡
苹果醋312 小时前
SpringCloud系列之一---搭建高可用的Eureka注册中心
运维·nginx
丶213615 小时前
【Nginx】在 Docker 上安装 Nginx 的详细指南
运维·nginx·docker
ZHOU西口1 天前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui
苹果醋31 天前
react 路由 react-router/react-router-dom
运维·nginx
ps酷教程2 天前
nginx进阶篇(二)
nginx
双普拉斯2 天前
微信小程序点赞动画特效实现
nginx·微信小程序·notepad++