在之前的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