Nginx反向代理

之前的blog中有提到,一个http请求到达服务器之后,会首先经过nginx进行反向代理,然后才会到达真实的web服务器。

本文将介绍nginx的主要配置。


Nginx的主要作用是反向代理,反向代理是针对web服务器提供加速功能,作为代理缓存,它并不是针对浏览器用户,而针对一台或多台特定的web服务器,它可以代理外部网络对内部网络的访问请求。

正向代理隐藏了客户端信息,而反向代理隐藏了服务器信息。

Nginx安装和使用

window下通过官网下载,ubuntu下通过命令行apt-get install命令直接安装即可。
window下直接以exe文件方式启动。
本文环境为ubuntu,在命令行执行nginx即可启动。
停止nginx命令:
nginx -s stop或者nginx -s quit
nginx的配置文件:/etc/nginx/nginx.conf,修改后通过以下命令平滑重启:
nginx -s reload

Nginx配置信息

Nginx的配置模块大体如下:

main   # 全局设置

events {  # nginx工作模式
	...
}

http {  # http设置
	...
	upstream myproject {
		...
	}
	server {  # 主机设置
		...
		location {  # URL匹配
			...
		}
	}
	server  {
        ...
        location {
            ...
        }
    }
    ...
}

如上述配置文件所示,主要由6个部分组成:
main: 用于进行nginx全局信息的配置
events:用于nginx工作模式的配置
server:用于进行服务器访问信息的配置
location:用于进行访问路由的配置
upstream:用于进行负载均衡的配置

main模块

下面是一个main区域及设置说明:

# 指定nginx worker进程运行用户以及用户组,默认是nobody
user nobody nobody;  
# Nginx要开启的子进程数,每个进程平均消耗10-12m内存。一般指定一个进程就够了,如果是多核 cpu,建议指定跟cpu数量一样的进程数即可。
worker_processes 2;  
# 全局错误日志文件,日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
error_log /usr/local/var/log/nginx/error.log notice;
# 进程id的存储文件位置
pid /usr/local/var/run/nginx/nginx.pid;
# 一个nginx进程可以打开的最多文件描述符数目
worker_rlimit_nofile 1024;

events模块

events模块用来指定nginx的工作模式和每个worker进程的连接数上限,如下所示:

events {
    use epoll;
    worker_connections  20480;

use 用来指定nginx工作模式。nginx支持的工作模式有:select,poll,kqueue,epoll,rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式。不同的是,epoll用在linux平台上,kqueue用在Mac平台的BSD系统中。

work_connections 用于定义每个进程接收前端的最大请求数,默认是1024。最大客户端连接数由work_processes * worker_connections,在作为反向代理时,max_clients变为:Max_clients = work_processes * worker_connections / 4。

进程的最大连接数受linux系统进程的最大打开文件数限制,在执行操作系统命令"ulimit -n 65536"进行修改后,这里的worker_connections的设置才能生效。
cat /proc/sys/fs/file-max # 查看系统级的最大限制
ulimit -n  # 查看用户级的限制,默认1024

http模块

http模块可以说是最核心的模块了,它负责HTTP服务器相关属性的配置,它里面的server和upstream子模块分别用于虚拟主机和负载均衡设置。http模块如下:

http {
	# 用来设定文件的mime类型,类型在mime.type文件定义,告诉nginx来识别文件类型
    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 /usr/local/var/log/nginx/access.log  main
    # 用于开启高效文件传输模式,将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    # 设置客户端链接保持活动的超时时间,超过这个时间服务器会关闭该连接
    keepalive_timeout 65;
    #gzip on;
    upstream myproject {
        .....
    }
    server {
        ....
    }
}

server模块

server模块是http的子模块,它用来定义一个虚拟主机。如下所示:

server {
    listen 8080;
    server_name www.howe.com;  # 映射到hosts文件中
    # 全局定义,如果都是这一个目录,这样定义最简单。
    root   /nginx/www;
    index  index.php index.html index.htm; 
    charset utf-8;
    access_log  log/access.log  main;
    error_log  log/error.log  error;
    ....
}

http模块中可以定义多个server。
listen 用于指定虚拟主机的服务端口。
server_name 用来指定ip地址或域名,多个域名之间用空格分开。
root表示在这整个server虚拟机内,全部的root web根目录
index 全局定义访问的默认首页地址。
charser 设置网页的默认编码格式。
access_log 指定此虚拟主机访问日志存放路径,后面的main是日志格式

location

location是server的子模块,是nginx中最重要的模块,主要用于配置路由访问信息。在路由访问信息配置中关联到反向代理,负载均衡等等各项功能。
基本配置如下:

location /test/ {
    root    /nginx/www;
    index    index.php index.html index.htm;
}

location /:表示匹配访问test目录
root:用于指定访问根目录时,虚拟主机的web目录,这个目录可以是相对路径(相对nginx的安装目录),也可以是绝对路径。
index:在不指定访问具体资源时,默认展示的资源文件列表。如果没有开启目录浏览权限,会报403错误。

反向代理配置方式
反向代理主要通过location模块下的proxy_pass选项,如下所示:

location /test {
    proxy_pass http://howetong.cn.com;
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header Host $http_host;
}

这里将对test目录的访问反向代理到负载均衡器howetong.cn.com。

upstream模块

upstream 模块负责负载均衡模块,通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。

upstream howetong.cn.com {
    ip_hash;
    server 192.168.12.1:80;
    server 192.168.12.2:80 down;
    server 192.168.12.3:8080  max_fails=3  fail_timeout=20s;
    server 192.168.12.4:8080;
}

这里通过upstream指令指定了负载均衡器的名称,这个名称会在反向代理配置时使用到。ip_hash是一种负载均衡调度算法。
Nginx的负载均衡模块目前支持4种调度算法:

weight轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight,表示轮询权值,weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。

ip_hash
每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。

fair(第三方)
比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。

url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx的hash软件包。

参考资料

[1]. https://www.jianshu.com/p/bed000e1830b
[2]. https://www.jianshu.com/p/aaf0ed20d33e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值