nginx

1. 快速安装

1.1 安装

yum install nginx

安装完成后命令行中输入nginx -v查看当前 Nginx 版本信息

image.png

1.2 相关文件夹

使用 rpm -ql nginx 来查看 Nginx 安装位置

image.png

主要文件夹有两个

  1. /etc/nginx/conf.d/ 子配置的配置项存放处,/etc/nginx/nginx.conf 主配置文件会默认把这个文件夹中所有子配置项都引入;

  2. /usr/share/nginx/html/ 文件夹,通常静态文件都放在这个文件夹,也可以放其他地方;

1.3 运行

安装之后开启 Nginx,如果系统开启了防火墙,那么需要设置一下在防火墙中加入需要开放的端口,下面列举几个常用的防火墙操作(没开启的话不用管这个):

systemctl start firewalld  # 开启防火墙
systemctl stop firewalld   # 关闭防火墙
systemctl status firewalld # 查看防火墙开启状态,显示running则是正在运行
firewall-cmd --reload      # 重启防火墙,永久打开端口需要reload一下

# 添加开启端口,--permanent表示永久打开,不加是临时打开重启之后失效
firewall-cmd --permanent --zone=public --add-port=8888/tcp

# 查看防火墙,添加的端口也可以看到
firewall-cmd --list-all

设置 Nginx 开机自启:

systemctl enable nginx

启动 Nginx:

systemctl start nginx

然后访问你的 IP,这时候就可以看到 Nginx 的欢迎页面了~ Welcome to nginx!

2. Nginx 操作常用命令

nginx -h 查看完整的命令

nginx -s reload  # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen  # 重启 Nginx
nginx -s stop    # 快速关闭
nginx -s quit    # 等待工作进程处理完成后关闭
nginx -T         # 查看当前 Nginx 最终的配置
nginx -t -c <配置路径>    # 检查配置是否有问题,如果已经在配置目录,则不需要-c

systemctl 是 linux 系统应用管理工具

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 运行状态

3. Nginx 配置语法

Nginx 的主配置文件是 /etc/nginx/nginx.conf,也可以使用 cat -n nginx.conf 来查看配置

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. 部分指令的参数支持正则表达式;

配置文件

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

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

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 {
      listen       80;       # 配置监听的端口
      server_name  localhost;    # 配置的域名

      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 块可以包含多个 location 块,location 指令用于匹配 uri,语法:

location [ = | ~ | ~* | ^~] uri {
  ...
}

指令后面:

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

如果 uri 包含正则表达式,则必须要有 ~~\* 标志。

4. 反向代理

反向代理.png

  1. proxy_set_header:在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。
  2. proxy_connect_timeout:配置 Nginx 与后端代理服务器尝试建立连接的超时时间。
  3. proxy_read_timeout:配置 Nginx 向后端服务器组发出 read 请求后,等待相应的超时时间。
  4. proxy_send_timeout:配置 Nginx 向后端服务器组发出 write 请求后,等待相应的超时时间。
  5. proxy_redirect:用于修改后端服务器返回的响应头中的 Location 和 Refresh。

使用反向代理解决跨域

在前端服务地址为 pan.yang143.cn 的页面请求 nas.yang143.cn 的后端服务导致的跨域,可以这样配置:

server {
  listen 9001;
  server_name pan.yang143.cn;

  location / {
    proxy_pass nas.yang143.cn;
  }
}

这样就将对前一个域名 pan.yang143.cn 的请求全都代理到了 nas.yang143.cn,前端的请求都被我们用服务器代理到了后端地址下,绕过了跨域。

5. 配置负载均衡

把负载均匀合理地分发到多个服务器上,实现压力分流的目的。

主要配置:

http {
  upstream myserver {
    # ip_hash;  # ip_hash 方式
    # fair;   # fair 方式
    server 127.0.0.1:8081;  # 负载均衡目的服务地址
    server 127.0.0.1:8080;
    server 127.0.0.1:8082 weight=10;  # weight 方式,不写默认为 1
  }

  server {
    location / {
      proxy_pass http://myserver;
      proxy_connect_timeout 10;
    }
  }
}

Nginx 提供了好几种分配方式,默认为轮询,就是轮流来。有以下几种分配方式:

  • 轮询,默认方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务挂了,能自动剔除;
  • weight,权重分配,指定轮询几率,权重越高,在被访问的概率越大,用于后端服务器性能不均的情况;
  • ip_hash,每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决动态网页 session 共享问题。负载均衡每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的;
  • fair(第三方),按后端服务器的响应时间分配,响应时间短的优先分配,依赖第三方插件 nginx-upstream-fair,需要先安装;

6. 一些常用技巧

6.1 图片防盗链

server {
  listen       80;
  server_name  *.yang143.cn;

  # 图片防盗链
  location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
    valid_referers none blocked server_names ~\.google\. ~\.baidu\. *.qq.com;  # 只允许本机 IP 外链引用,将百度和谷歌也加入白名单
    if ($invalid_referer){
      return 403;
    }
  }
}

6.2 请求过滤

# 非指定请求全返回 403
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
  return 403;
}

location / {
  # IP访问限制(只允许IP是 192.168.1.1 机器访问)
  allow 192.168.1.1;
  deny all;

  root   html;
  index  index.html index.htm;
}

6.3 配置图片、字体等静态文件缓存

由于图片、字体、音频、视频等静态文件在打包的时候通常会增加了 hash,所以缓存可以设置的长一点,先设置强制缓存,再设置协商缓存;如果存在没有 hash 值的静态文件,建议不设置强制缓存,仅通过协商缓存判断是否需要使用缓存。

# 图片缓存时间设置
location ~ .*\.(css|js|jpg|png|gif|swf|woff|woff2|eot|svg|ttf|otf|mp3|m4a|aac|txt)$ {
  expires 10d;
}

# 如果不希望缓存
expires -1;

6.4 HTTP 请求转发到 HTTPS

server {
    listen      80;
    server_name yang143.cn;

    # 单域名重定向
    if ($host = 'yang143.cn'){
        return 301 https://yang143.cn$request_uri;
    }
    # 全局非 https 协议时重定向
    if ($scheme != 'https') {
        return 301 https://$server_name$request_uri;
    }

    # 或者全部重定向
    return 301 https://$server_name$request_uri;

    # 以上配置选择自己需要的即可,不用全部加
}

7. 最佳实践

  • 为了使 Nginx 配置更易于维护,建议为每个服务创建一个单独的配置文件,存储在 /etc/nginx/conf.d 目录,根据需求可以创建任意多个独立的配置文件。

  • 独立的配置文件,建议遵循以下命名约定 <服务>.conf,比如域名是 yang143.cn,那么你的配置文件的应该是这样的 /etc/nginx/conf.d/yang143.cn.conf,如果部署多个服务,也可以在文件名中加上 Nginx 转发的端口号,比如 yang143.cn.8080.conf,如果是二级域名,建议也都加上 pan.yang143.cn.conf

  • 常用的、复用频率比较高的配置可以放到 /etc/nginx/snippets 文件夹,在 Nginx 的配置文件中需要用到的位置 include 进去,以功能来命名,并在每个 snippet 配置文件的开头注释标明主要功能和引入位置,方便管理。

  • Nginx 日志相关目录,内以 域名.type.log 命名(比如 nas.yang143.cn.access.lognas.yang143.cn.error.log )位于 /var/log/nginx/ 目录中,为每个独立的服务配置不同的访问权限和错误日志文件,这样查找错误时,会更加方便快捷。