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
相关推荐
cnskylee19 小时前
【Nginx】Nginx-1.28.1版本已恢复对CentOS 7的兼容性
运维·nginx·centos
Knight_AL2 天前
Docker 中的端口映射原理:为什么 Nginx 要 `listen 80`,而不是“随便写端口”
nginx·docker·容器
虹梦未来2 天前
【运维心得】Ubuntu2404编译nginx隐藏Server信息
运维·服务器·nginx
tgethe2 天前
Nginx笔记
运维·笔记·nginx
invicinble2 天前
对于nginx(一,认识nginx)
运维·nginx
徒手千行代码无bug2 天前
Nginx upstream 负载均衡 404,单节点转发正常的根因与解决
运维·nginx·负载均衡
irisart2 天前
第二章【NGINX 开源功能】—— 七层反向代理(下)
运维·nginx
xixiyuguang2 天前
nginx tar离线安装 ubuntu22.04
运维·nginx
丁丁丁梦涛2 天前
nginx解决域名代理到IP+端口的平台静态资源和接口地址问题
运维·tcp/ip·nginx
苹果醋32 天前
24.记录Vue项目iview组件日期获取时间少一天
java·运维·spring boot·mysql·nginx