IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Nginx架构三之核心配置文件 -> 正文阅读

[系统运维]Nginx架构三之核心配置文件

Nginx配置详解

安装完毕Nginx后,会有相应的安装目录,安装目录里的conf/nginx.conf为nginx的主配置文件,nginx主配置文件分为4部分,main(全局配置)、server(主机配置)、upstream(负载均衡服务器设置)以及location(URL匹配特定位置的设置)。

在 nginx.conf 的注释符号为: #
默认的 nginx 配置文件 nginx.conf 内容如下:

########   Nginx的main(全局配置)文件

#指定nginx运行的用户及用户组,默认为nobody
#user  nobody;

#开启的线程数,一般跟逻辑CPU核数一致
worker_processes  1;

#定位全局错误日志文件,级别以notice显示,还有debug,info,warn,error,crit模式,debug输出最多,crir输出最少,根据实际环境而定
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#指定进程id的存储文件位置
#pid        logs/nginx.pid;

#指定一个nginx进程打开的最多文件描述符数目,受系统进程的最大打开文件数量限制
#worker_rlimit_nofile 65535

events {
	#设置工作模式为epoll,除此之外还有select,poll,kqueue,rtsig和/dev/poll模式
	#use epoll;
	
    #定义每个进程的最大连接数,受系统进程的最大打开文件数量限制。
    worker_connections  1024;
}

#######Nginx的Http服务器配置,Gzip配置
http {
	#主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。
    include       mime.types;
    
	#核心模块指令,智力默认设置为二进制流,也就是当文件类型未定义时使用这种方式
    default_type  application/octet-stream;

    #下面代码为日志格式的设定,main为日志格式的名称,可自行设置,后面引用
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #引用日志main
    #access_log  logs/access.log  main;

	#开启高效文件传输模式
    sendfile        on;
    #开启防止网络阻塞
    #tcp_nopush     on;

	#设置客户端连接保存活动的超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;

	#开启gzip压缩
    #gzip  on;

	#########Nginx的server虚拟主机配置
    server {
    	#监听端口为 80
        listen       80;
        #设置主机域名
        server_name  localhost;
		#设置访问的语言编码
        #charset koi8-r;
 		#设置虚拟主机访问日志的存放路径及日志的格式为main
        #access_log  logs/host.access.log  main;

		#设置虚拟主机的基本信息
        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

nginx 文件结构

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。

work process指令

用于配置Nginx生成工作进程的数量,这个是Nginx 服务器实现并发处理服务的关键所在。理论上来说workder process的 值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要 受到来自服务器自身的限制,建议将该值和服务器CPU的内核数保存一 致。

语法worker_processes num/auto;
默认值1
位置全局块

如果将worker_processes设置成2,则会看到如下内容

yangyanping@ZBMac-WP2HJYDWY nginx % sudo sbin/nginx -s reload -c conf/nginx.conf
yangyanping@ZBMac-WP2HJYDWY nginx % ps -ef |grep nginx
    0  1378     1   0 10:52下午 ??         0:00.00 nginx: master process ./sbin/nginx -q 
   -2 20257  1378   0 10:17下午 ??         0:00.00 nginx: worker process 
   -2 20258  1378   0 10:17下午 ??         0:00.00 nginx: worker process 
  502 20285   496   0 10:18下午 ttys002    0:00.00 grep nginx
yangyanping@ZBMac-WP2HJYDWY nginx %

Nginx负载均衡算法

Nginx提供的多种负载均衡策略,如:轮询,加权轮询,Ip hash。下面我们对其一一进行演示。
我们搭建一个测试环境,部署三个web应用,分别为serverA , serverB,serverC,并在hosts文件中配置测试域名。

127.0.0.1 www.test-nginx.com
  • serverA 的访问地址
    http://www.test-nginx.com:9091/web/hello
    输出内容:hello,I am server A !
    - serverB 的访问地址
    http://www.test-nginx.com:9092/web/hello
    输出内容:hello,I am server B !
    - serverC 的访问地址
    http://www.test-nginx.com:9093/web/hello
    输出内容:hello,I am server C !

1. 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

worker_processes  4;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    keepalive_timeout  65;
    
	#设置虚拟主机的基本信息
    upstream myweb {
	    server 127.0.0.1:9091;
        server 127.0.0.1:9092;
        server 127.0.0.1:9093;
    }
    server {
        listen       80;
        server_name  localhost;

      location /proxy/{
          proxy_pass http://myweb/web/;
	}
        location / {
           root   html;
           index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

发送10次请求访问地址:http://www.test-nginx.com/proxy/hello,输出如下:

hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server A !

在这里插入图片描述

2. 加权轮询
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

    upstream myweb {
		server 127.0.0.1:9091 weight=1;
        server 127.0.0.1:9092 weight=2;
        server 127.0.0.1:9093 weight=2;
    } 

发送10次请求访问地址:http://www.test-nginx.com/proxy/hello,输出如下:

hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server B !
hello,I am server C !
hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server B !
hello,I am server C !

在这里插入图片描述

3. Ip hash 算法
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

    upstream myweb {
		server 127.0.0.1:9091;
        server 127.0.0.1:9092;
        server 127.0.0.1:9093;
        ip_hash;
    }

发送10次请求访问地址:http://www.test-nginx.com/proxy/hello,输出如下:

hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !

在这里插入图片描述
4. fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    upstream myweb {
		server 127.0.0.1:9091;
        server 127.0.0.1:9092;
        server 127.0.0.1:9093;
        fair;
    }

5. url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

 	upstream myweb {
		server 127.0.0.1:9091;
        server 127.0.0.1:9092;
        server 127.0.0.1:9093;
        hash $request_uri; 
		hash_method crc32; 
    }

Nginx实现热备

负载均衡的server中常见配置

upstream myweb { 
	ip_hash; 
	server 127.0.0.1:9091;
	server 127.0.0.1:9092 down; (down 表示当前的server暂时不参与负载) 
	server 127.0.0.1:9093 weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
	server 127.0.0.1:9094 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 
} 

我们配置serverC端口为备份服务器,当serverA 和 serverB 都挂掉后 会自动使用备份服务器server C(9093端口),但当主服务器serverA 或serverB又启动后,在继续使用主服务器serverA 或serverB,nginx.conf配置如下:

upstream myweb {
		server 127.0.0.1:9091;
        server 127.0.0.1:9092;
        server 127.0.0.1:9093 backup;
    }

    server {
        listen       80;
        server_name  localhost;

      location /proxy/{
          proxy_pass http://myweb/web/;
	}

访问地址:http://www.test-nginx.com/proxy/hello 10次输出结果如下,从中可以看出请求未访问到serveC (server 127.0.0.1:9093)。

hello,I am server A !
hello,I am server B !
hello,I am server A !
hello,I am server B !
hello,I am server A !
hello,I am server B !
hello,I am server A !
hello,I am server B !
hello,I am server A !
hello,I am server B !

主动停掉server A(9091端口),再次发送10次请求,10次输出结果如下:

hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !

再主动停掉serverB(9092端口),再次发送10次请求,10次输出结果如下,主服务器serverA和serverB均已宕机,客户端请求都访问到备份服务器serverC。

hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !

启动主服务器 serverB后,再次发送10次请求,10次输出结果如下,主服务器serverB已启动,客户端请求会优选访问主服务器,所以请求都会访问到主服务器serverB。

hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !

proxy_pass详解

在Nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。
假设下面四种情况分别用 http://127.0.0.1/proxy/hello 进行访问。

  • 第一种配置,代理URL:http://127.0.0.1:9091/hello
    location /proxy/ {
    proxy_pass http://127.0.0.1:9091/
    }
  • 第二种配置,代理URL:http://127.0.0.1:9091/proxy/hello
    location /proxy/ {
    proxy_pass http://127.0.0.1:9091
    }
  • 第三种配置,代理URL:http://127.0.0.1:9091/web/hello
    location /proxy/ {
    proxy_pass http://127.0.0.1:9091/web/
    }
  • 第三种配置,代理URL:http://127.0.0.1:9091/webhello
    location /proxy/ {
    proxy_pass http://127.0.0.1:9091/web
    }
    MVC测试代码
@RestController
public class HelloController {
    @GetMapping({"/web/hello", "webhello"})
    public String hello() {
        return "hello,I am server A!";
    }
}

Nginx日志详解

Nginx日志主要分为两种:访问日志和错误日志。日志开关在Nginx配置文件(/nginx/conf/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的。

  • 访问日志
    访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义。通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息。Nginx中访问日志相关指令主要有两条:
    log_format:log_format用来设置日志格式,也就是日志文件中每条日志的格式,具体如下:log_format name(格式名称) type(格式样式)
    举例说明如下:
 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
名称描述
$remote_addr远程客户端的IP地址
$server_name虚拟主机名称
-空白,用一个“-”占位符替代,历史原因导致还存在
$remote_user远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如果没有登录就是空白
[$time_local]访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时
$request请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
$status记录请求返回的http状态码,比如成功是200
$uptream_statusupstream状态,比如成功是200
$upstream_addr后端服务器的IP地址
$http_referer记录从哪个页面链接访问过来的
$http_user_agent客户端浏览器信息
$http_x_forwarded_for客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_addr拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址
  • access_log
    能够使用access_log指令的字段包括:http、server、location。
    需要注意的是:nginx进程设置的用户和组必须对日志路径有创建文件的权限,否则,会报错。
    Nginx支持为每个location指定强大的日志记录。同样的连接可以在同一时间输出到不止一个的日志中。
    access_log指令用来指定日志文件的存放路径(包含日志文件名)、格式和缓存大小,具体如下:
access_logpath(存放路径)[format(自定义日志格式名称) [buffer=size off]]
access_loglogs/access.logmain
access_logoff 关闭日志
127.0.0.1 - - [07/Jan/2021:19:37:56 +0800] 
"GET /proxy/hello HTTP/1.1" 200 22 "-" 
"Mozilla/5.0 (Macintosh; 
Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) 
Chrome/87.0.4280.88 Safari/537.36"
  • 错误日志
    错误日志主要记录客户端访问nginx出错时的日志,格式不支持自定义。通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定,具体格式如下:
error_log存放路径path日志等级level
error_loglogs/error.loginfo
error_log/dev/null关闭日志
  path含义同access_log,level表示日志等级,具体如下:
 [ debug | info | notice | warn | error | crit ]
从左至右,日志详细程度逐级递减,即debug最详细,crit最少。日志内容:
2021/01/07 18:30:39 [error] 
45306#0: *507 no live upstreams while connecting to upstream, 
client: 127.0.0.1, server: localhost, 
request: "GET /proxy/hello HTTP/1.1", upstream: "http://myweb/web/hello", 
host: "www.test-nginx.com"
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:30:52  更:2022-05-08 08:31:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:54:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码