nginx

什么是Nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。

Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡服务器。在性能上,Nginx占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率;在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。

Nginx支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动。

nginx特点

1.正向代理:

概括说:就是客户端和代理服务器可以直接互相访问,属于一个LAN(局域网);代理对用户是非透明的,即用户需要自己操作或者感知得到自己的请求被发送到代理服务器;代理服务器通过代理用户端的请求来向域外服务器请求响应内容。

2.反向代理:

概括说:就是代理服务器和真正server服务器可以直接互相访问,属于一个LAN(服务器内网);代理对用户是透明的,即无感知。不论加不加这个反向代理,用户都是通过相同的请求进行的,且不需要任何额外的操作;代理服务器通过代理内部服务器接受域外客户端的请求,并将请求发送到对应的内部服务器上。

3.负责均衡:

请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。

4.动静分离:

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。

使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。

nginx的应用场景

1.http服务器:静态资源服务,通过本地文件系统提供服务

2.反向代理服务,延伸出包括缓存,安全和权限,负载均衡等

3.API服务,OpenResty

4.虚拟主机:可以实现在一台服务器虚拟出多个网站, 基于端口的和基于域名的

nginx基本配置

nginx的主配置文件是 /etc/nginx/nginx.conf,结构如下:

main        # 全局配置,对全局生效
├── events  # 配置影响 Nginx 服务器或与用户的网络连接
├── http    # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│   ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│   ├── server   # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│   ├── server
│   │   ├── location  # server 块可以包含多个 location 块,location 指令用于匹配 uri
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

配置语法:

1.配置文件由指令与指令块构成;
2.每条指令以 ; 分号结尾,指令与参数间以空格符号分隔;
3.指令块以 {} 大括号将多条指令组织在一起;
4.include 语句允许组合多个配置文件以提升可维护性;
5.使用 # 符号添加注释,提高可读性;
6.使用 $ 符号使用变量;
7.部分指令的参数支持正则表达式; 

server 块可以包含多个 location 块,location 指令用于匹配 uri,语法:

location [ = | ~ | ~* | ^~] uri {
 ...
}
指令后面:

= 精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;
^~ 用于不含正则表达式的 uri; 前,表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找;
~ 表示用该符号后面的正则去匹配路径,区分大小写;
~* 表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~ 优先级都比较低,如有多个location的正则能匹配的话,则使用正则表达式最长的那个;
如果 uri 包含正则表达式,则必须要有 ~ 或 ~* 标志。

  • main 全局配置,对全局生效;
  • events 配置影响 Nginx 服务器与用户的网络连接;
  • http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
  • server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
  • location 用于配置匹配的 uri ;
  • upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分; 

典型配置:

# main段配置信息
user  nginx;                        # 运行用户,默认即是nginx,可以不进行设置
worker_processes  auto;             # Nginx 进程数,一般设置为和 CPU 核数一样
error_log  /var/log/nginx/error.log warn;   # Nginx 的错误日志存放目录
pid        /var/run/nginx.pid;      # Nginx 服务启动时的 pid 存放位置

# events段配置信息
events {
    use epoll;     # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
    worker_connections 1024;   # 每个进程允许最大并发数
}

# http段配置信息
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http { 
    # 设置日志模式
    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  /var/log/nginx/access.log  main;   # Nginx访问日志存放位置

    sendfile            on;   # 开启高效传输模式
    tcp_nopush          on;   # 减少网络报文段的数量
    tcp_nodelay         on;
    keepalive_timeout   65;   # 保持连接的时间,也叫超时时间,单位秒
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;      # 文件扩展名与类型映射表
    default_type        application/octet-stream;   # 默认文件类型

    include /etc/nginx/conf.d/*.conf;   # 加载子配置项
    
    # server段配置信息
    server {
     listen       80;       # 配置监听的端口
     server_name  localhost;    # 配置的域名
      
     # location段配置信息
     location / {
      root   /usr/share/nginx/html;  # 网站根目录
      index  index.html index.htm;   # 默认首页文件
      deny 172.168.22.11;   # 禁止访问的ip地址,可以为all
      allow 172.168.33.44;# 允许访问的ip地址,可以为all
     }
     
     error_page 500 502 503 504 /50x.html;  # 默认50x对应的访问页面
     error_page 400 404 error.html;   # 同上
    }
}

虚拟主机:

server {
  listen 80;
 server_name fe.sherlocked93.club;

 location / {
  root  /usr/share/nginx/html/fe;
  index index.html;
 }
}

反向代理:

在前端服务地址为 fe.sherlocked93.club 的页面请求 be.sherlocked93.club 的后端服务导致的跨域,可以这样配置:

server {
  listen 9001;
  server_name fe.sherlocked93.club;

  location / {
    proxy_pass be.sherlocked93.club;
  }
}
这样就将对前一个域名 fe.sherlocked93.club 的请求全都代理到了 be.sherlocked93.club,前端的请求都被我们用服务器代理到了后端地址下,绕过了跨域。

这里对静态文件的请求和后端服务的请求都以 fe.sherlocked93.club 开始,不易区分,所以为了实现对后端服务请求的统一转发,通常我们会约定对后端服务的请求加上 /apis/ 前缀或者其他的 path 来和对静态资源的请求加以区分,此时我们可以这样配置:

# 请求跨域,约定代理后端服务请求path以/apis/开头
location ^~/apis/ {
    # 这里重写了请求,将正则匹配中的第一个分组的path拼接到真正的请求后面,并用break停止后续匹配
    rewrite ^/apis/(.*)$ /$1 break;
    proxy_pass be.sherlocked93.club;
  
    # 两个域名之间cookie的传递与回写
    proxy_cookie_domain be.sherlocked93.club fe.sherlocked93.club;
}

负载均衡:

1.轮询

upstream backserver {
    server 192.168.0.14;
    server 192.168.0.15;
}

2.weight

upstream backserver {
    server 192.168.0.14 weight=3;
    server 192.168.0.15 weight=7;
}

3.ip_hash 同一客户端的连续请求会被分发到同一服务器处理

upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}

4. fair 按后端服务器的响应事件来分配请求,响应时间段的优先分配

upstream backserver {
    server server1;
    server server2;
    fair;
}

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

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

域配置header解决跨

# /etc/nginx/conf.d/be.sherlocked93.club.conf

server {
  listen       80;
  server_name  be.sherlocked93.club;
  
 add_header 'Access-Control-Allow-Origin' $http_origin;   # 全局变量获得当前请求origin,带cookie的请求不支持*
 add_header 'Access-Control-Allow-Credentials' 'true';    # 为 true 可带上 cookie
 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  # 允许请求方法
 add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers;  # 允许请求的 header,可以为 *
 add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
 
  if ($request_method = 'OPTIONS') {
  add_header 'Access-Control-Max-Age' 1728000;   # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求
  add_header 'Content-Type' 'text/plain; charset=utf-8';
  add_header 'Content-Length' 0;
    
  return 204;                  # 200 也可以
 }
  
 location / {
  root  /usr/share/nginx/html/be;
  index index.html;
 }
}

nginx操作常用命令

nginx -s reload 热重启

nginx -s reopen 重启nginx

nginx -s stop 快速关闭

nginx -s quit  等待工作进程处理完成后关闭

nginx -T 查看当前nginx最终配置

nginx -t -c<配置路径> 检查配置是否有问题,如果已经再配置目录,则不需要-c

systemctl是linux系统应用管理工具systemd的主命令,用于管理系统,我们也可以用它来对nginx进行管理,相关命令如下:

systemctl start nginx 启动nginx

systemctl stop nginx 停止nginx

systemctl restart nginx 重启nginx

 systemctl  reload nginx 重新加载nginx 用于修改配置后

systemctl  enable nginx  设置开机启动nginx

systemctl  disable nginx 关闭开机启动nginx

systemctl status nginx 查看nginx运行状态

nginx 日志查看 

error.log

nginx 错误日志
```
error_log  logs/error.log;
error_log  logs/error.log  notice;  //前面是路径,后面是错误级别
error_log  logs/error.log  info;
            
```
access_log

nginx 每一次访问日志

```
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 客户端地址
                 // $remote_user 客户端请求的用户名,没有开启认证模块,不会被记录
                 // $time_local 时间
                 // $request 请求头信息
                 // $status 返回状态
                 // $body_bytes_sent 响应的 body 的大小
                 // $http_referer 上一级访问的地址,不是客户端上一次访问的页面地址
                 // $http_user_agent 访问的客户端类型(浏览器,curl,等)
                 // $http_x_forwarded_for 每一级请求中的 http 信息

access_log  logs/access.log  main;  

// logs/access.log 是路径,
// main是格式名字,和上面 log_format 中定义的变量名要对应。

```
log_format

Syntax: log_format name [escape=default|json] string ...;  
// log_format 是关键字。
// name 格式的名字,可以自定义,类似于变量名。
// $xxx  这是 log_format 的变量。

Default: log_format combined "...";

Context: http
// 只能配置在 http 模块下
可以放在 log_format 中的变量

第一种:HTTP 请求变量

arg_PARAMETER、http_HEADER、sent_http_HEADER

例如,想要记录 http 头部信息中的 User-Agent 信息。需要这么配置

log_format  main  '$http_user_agent';
注意,前面要有 $ 符号,所有字母小写,有中划线要换成下划线。

第二种:Nginx 内置变量

Nginx 支持的变量太多,可以访问官网查看。

第三种:自己定义的变量

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值