Nginx简介

Nginx 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。

项目中主要使用的是Web服务器和反向代理功能。

Nginx特点:

占有内存少,并发能力强,以高性能,低系统资源消耗。

官方测试为5W并发请求,实际情况看服务器性能。

反向代理与正向代理

反向代理

代理服务器(Nginx)接收外部请求,不处理请求,直接将其转发给内部服务器,并将内部服务器的结果返回给请求的客户端,这就是反向代理,Nginx也是通过反向代理来实现负载均衡的。

正向代理

以访问网站为例,当本机无法访问时,找到一台可以访问的服务器作为本机的代理服务器,告诉代理服务器需要访问的网站,然后代理服务器接收到我的请求,并将网站的返回结果给我。

简单来说就是VPN。

Nginx下载和安装

官方网站:http://nginx.org 

# 添加 EPEL 软件仓库
yum install epel-release -y

# 安装nginx
yum install nginx -y

# 启动nginx,并设置未开机启动
systemctl start nginx
systemctl enable nginx

# 安装完成后,如果localhost:80访问不了可能是以下问题
# 1.防火墙80端口未开放
# 查看80端口是否开放
firewall-cmd --query-port=80/tcp
# 解决方式1:关闭防火墙
systemctl stop firewalld
# 解决方法2:开放80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

# 2.SELinux策略导致访问失败
# 临时关闭SELinux
setenforce 0
# 如果临时关闭后可以访问,说明确实是SELinux引起的问题
# 解决方法1:永久设置SELinux为宽容模式,需要重启生效
# 宽容模式不会强制拦截,会记录日志
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
reboot
# 解决方法2:永久关闭SELinux,需要重启生效
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
reboot
# 解决方法3:添加nginx到selinux的允许列表
yum install policycoreutils-python  
cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx  
semodule -i mynginx.pp

Nginx默认文件目录

yum方式安装的默认文件路径

默认配置文件的路径:/etc/nginx/nginx.conf  

Nginx网站默认存放目录:/usr/share/nginx/html

网站默认主页路径:/usr/share/nginx/html/index.html

Nginx配置文件详解

默认配置文件

# 配hiworker进行的运行用户
user nginx;
# 配置工作进行的数量,根据硬件调整,通常为CPU数量的 0.8-2倍,自动模式待了解
worker_processes auto;
#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log /var/log/nginx/error.log;
#配置进程pid文件 
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

#配置工作模式和连接数
events {
# 一个worker进程的连接上限,最大值是65536
# nginx 总连接数(并发数) =
# worker进程数量(worker_processes)* 一个worker的连接上限(worker_connections)
    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日志及存放路径,并使用上面定义的main日志格式(访问记录)
    access_log  /var/log/nginx/access.log  main;
    #开启高效文件传输模式(默认打开即可)
	sendfile            on;
	#防止网络阻塞(上线通常要打开)
	tcp_nopush          on;
	# 禁用Nagle算法,可以减少延迟,nagle算法是为了减少网络中小包数量的tcp优化机制,他会获				取到小包后等待其他小包后合并再发送,而web服务往往需要数据包很小也要立刻发送
	tcp_nodelay         on;
	#长连接超时时间,单位是秒
    keepalive_timeout   65;
    types_hash_max_size 4096;
	#配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
	#如果文件在支持的类型中就会返回文件,如果不在就会以下面默认文件类型返回也就是文件流的方式返回
	include             /etc/nginx/mime.types;
	#默认文件类型 流类型,可以理解为支持任意类型
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

	#配置虚拟主机,可以有多个server,但是两个server的端口和服务名不能完全一致
	# 可以同端口不同服务名或同服务名不同端口
	server {
    	#配置监听端口 IPv4
        listen       80;
    	#配置监听端口 IPv6
        listen       [::]:80;
    	#配置服务名
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
	}

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2;
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

基本配置文件示例

在默认配置文件中通过 include /etc/nginx/conf.d/*.conf; 将/etc/nginx/conf.d 目录下的 .conf 文件追加进入了Nginx配置文件的http { }中,所以在/etc/nginx/conf.d目录下创建的 .conf文件只需要配置server即可。

下面是一些示例:

server {
	# 监听端口 IPv4
	listen       80;
	# 服务名(域名)
	server_name  example.com;
	
	# 静态资源路由配置
	location / {
		# 静态资源目录,这里会访问目录下的 index.html
		root   /home/projects/web-ui;
		# 当访问的URI无法直接映射到文件时,尝试按顺序匹配 URI 及其尾部添加'/'后的URI,最后指向 '/index.html'
		try_files $uri $uri/ /index.html;
		# 设定索引文件,当请求的是目录时,优先查找这些文件作为默认页面
		index  index.html index.htm;
	}
	
	# 代理转发至后端服务配置
	location /api/{
		# 将匹配到/api/的所有请求转发到本地8080端口的服务
		proxy_pass http://localhost:8080/;
		# 将请求Host头原封不动传递给后端
		proxy_set_header Host $http_host;
		# 设置真实的客户端IP地址
		proxy_set_header X-Real-IP $remote_addr;
		# 设置远程主机IP地址(这里与X-Real-IP相同)
		proxy_set_header REMOTE-HOST $remote_addr;
		# 添加经过代理的IP列表,包含客户端IP和其他中间代理IP
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}

	# 阻止对 '/actuator' 目录的访问
	if ($request_uri ~ "/actuator") {
		# 返回403 Forbidden错误码,禁止访问
		return 403;
	}
	
	# 错误页面配置,当出现500、502、503、504错误时,显示自定义错误页面
	error_page   500 502 503 504  /50x.html;
	# 定义50x错误页面的具体位置
	location = /50x.html {
		# 在html目录下寻找名为50x.html的文件作为错误页面
		root   html;
	}
}

HTTPS基本配置文件示例

upstream servers {
  server 127.0.0.1:8080;
}

server {
  listen 80;
  listen [::]:80;
  # 配置www.example.cn与example.cn 是因为用户如果通过example.cn访问,则映射不到此处
  server_name www.example.cn example.cn;
  # 将请求转成https
  if ($host = 'example.cn' ){
    rewrite ^/(.*)$ https://www.example.cn/$1 permanent;
  }	
  rewrite ^(.*)$ https://$host$1 permanent;
}

server {
       listen 443 ssl http2;
       listen [::]:443 ssl http2;
       server_name www.example.cn example.cn;
       # ssl证书的pem文件路径
       ssl_certificate  /etc/nginx/ssl/server.crt;
       # ssl证书的key文件路径
       ssl_certificate_key /etc/nginx/ssl/server.key;
       ssl_session_cache shared:SSL:1m;
       ssl_session_timeout  10m;
       ssl_ciphers HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers on;
	   # 此项目不是前后端分离项目,所以地址为后端服务器
       location / {
         proxy_pass http://servers;
         proxy_set_header HOST $host;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
}

上游服务器池(upsteam)

有多台后端服务器时,可以通过上游服务器池(upstream)实现负载均衡策略访问。

upstream与轮询策略

#配置上游服务器 
#格式为:upstream 自定义服务器组名称{服务器地址1,服务器地址2...}
# 默认为轮询策略
upstream servers {
	server 192.168.1.99:8080;
	server 192.168.1.98:8080;
	...
}
# 使用方式,将proxy_pass中的地址修改为服务器组名称即可
server {
	...
	location /api/{
		# proxy_pass http://localhost:8080/;
		proxy_pass http://servers;
	}
	...
}

# 其他策略
# 加权轮询 
# 1/1+2 的请求发给99服务器
# 2/1+2 的请求发给98服务器
upstream servers {
	server 192.168.1.99:8080 weight=1;
	server 192.168.1.98:8080 weight=2;
	...
}

# iphash策略
# 用户在一定时间内IP地址时固定的,所以通过IP的hash函数计算得到的值也是固定的
# 那么该用户的请求会被转发到同一台服务器
upstream servers {
	# 这里是iphash策略
	ip_hash;
	server 192.168.1.99:8080;
	server 192.168.1.98:8080;
	...
}
# url_hash策略
# 与iphash策略相似,是通过url进行hash函数计算
upstream servers {
	hash $request_uri;
	server 192.168.1.99:8080 weight=1;
	server 192.168.1.98:8080 weight=2;
	...
}

# least_conn策略(最少连接策略)
# least_conn策略会追踪所有后端服务器当前的活动连接数,将新的请求分配给活跃连接数最少的服务器,同时可以配合加权使用(weight=2)
upstream servers {
	least_conn;
	server 192.168.1.99:8080;
	server 192.168.1.98:8080;
	...
}

upstream与服务标识(down与backup)

down:表示服务器宕机,Nginx不会将请求转发给它。

backup:表示这个服务是备份服务器,当其他服务器都无法访问时,Nginx才会将请求转发给备份服务器使用。

upstream servers {
	server 192.168.1.99:8080 down;
	server 192.168.1.98:8080 backup;
	server 192.168.1.97:8080;
	...
}