目录
简介
Nginx是什么?
Nginx全局配置
全局配置之事件类配置
使用Nginx的HTTP模块配置静态Web服务器
HTTP配置项
HTTP客户端配置项
文件操作配置项
虚拟主机与请求分发
网络连接配置
server配置块
使用Nginx的HTTP的代理模块配置反向代理服务器
Nginx四层代理
在公司的工作中,接触到阿里云的组网方式和网络架构这一块,其中除了SLB,最常用的还有Nginx Web服务器。其中涉及到Nginx的四层代理、七层代理、静态路由、反向代理等知识。在参阅了相关的学习资料后,今天就对常用的Nginx模块以及配置方法做一个较为详细的总结记录。
Nginx是俄罗斯的Igor Sysoev在为Rambler Media工作期间,使用C语言开发的具有高可靠性、高性能、高扩展性且支持诸多操作系统等特性的跨平台的Web服务器,使用Nginx服务器,能够减小其上游服务器的压力。因为其出色的性能,其作为Web服务器被广泛应用到了大流量的网站上,如国内的腾讯、网易和阿里等等。
Nginx中包含了许多的模块,用户在安装的时候可以根据自己具体使用到的模块进行安装,目前使用最多的应该就是HTTP模块,使用HTTP的代理模块属于Nginx的七层应用代理,本文的末尾会补充讲一下Nginx的四层应用代理,以及它们之间的区别。首先,我们就从最常用的HTTP模块讲起,介绍具体使用过程中如何配置使用HTTP模块。
默认编译安装Nginx后,Nginx的默认安装根目录为/usr/local/nginx,Nginx默认的可执行文件的路径为/usr/local/nginx/sbin/nginx,Nginx默认的配置文件路径为/usr/local/nginx/conf/nginx.conf,用户可以通过参数在编译时自行设置Nginx的这些路径。在Nginx的配置文件中,大概由以下的一些配置项组成,Nginx全局配置、Nginx事件类配置、Nginx模块配置(如HTTP模块),其中模块配置中又包含了虚拟服务器配置块、location配置块、负载均衡配置块等等。这些配置定义了Nginx的工作方式。在Nginx的配置中,可以使用include包含预定义的配置文件,只要保证配置文件格式正确,include可以被包含在HTTP、Server等配置块。
首先需要介绍的是Nginx的全局配置,具体的配置字段及说明如图
其中最后两个配置项应当放在events事件类配置项中,在事件类配置项中还可以配置以下配置项
负载均衡锁:
accept_mutex on(默认)/off;
负载均衡锁文件路径:
lock_file path/file;
使用负载均衡锁后到真正建立连接时间的最大延迟:
accept_mutex_delay 1000ms(默认500ms);
批量建立新连接:
multi_accept on/off(默认);
选择事件模型(对于Linux来说有以下三种,如果未选择的话Nginx会自动使用最适合的事件模型):
use poll/select/epoll;
Nginx配置文件的顶部应该应该先定义全局配置,因此该配置处于Nginx的配置文件顶部。
在Nginx的配置中定义了全局配置之后,就可以开始对Nginx中使用的模块进行配置,本文主要针对HTTP模块的配置做详细讲解。在Nginx中支持使用HTTP模块配置静态Web服务器,所谓静态Web服务器,也就是不使用反向代理,Nginx在接收到请求后不通过上游的服务器处理,而是直接由Nginx处理并返回请求。由于Nginx的功能很强大,涉及到的配置项较多,这里只列出了常用的一些配置项。
使用Nginx的HTTP模块时,server配置块,location配置块都是包含在HTTP配置块中的,首先我们需要定义HTTP的相关配置参数,其实也就是和HTTP请求相关的一些参数,常见的配置项如下
该配置项放在HTTP配置块中,用以定义Nginx如何处理客户端请求
表中给出了每个配置项对应的含义,个人觉得client_max_body_size这一项的解释有误,该指令定义的应该是运行最大的客户端请求体,在其他资料中已证实了该配置项确实是限制客户端请求体的。
在用户请求中需要对文件进行一些操作使,该配置项定义了Nginx如何处理文件操作
在Nginx的配置中,每个server块就定义了一个虚拟主机,为了提高Nginx寻找对应server的能力,Nginx中使用散列表来存储server name,以下是关于Nginx中HTTP模块散列表的一些配置项
除了以上配置,Nginx允许定义HTTP请求中的网络连接配置, 配置项如下
在HTTP模块中定义server,即定义虚拟主机对请求进行处理,在server配置块中,主要配置server_name和监听相关的配置,监听使用listen参数配置,具体的配置项如下
在server配置块中,需要对HTTP请求进行路由匹配和处理,路由匹配在server中通过location配置块进行定义,location模块的匹配规则如下
location中的@表示该路由仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求。location还可以使用正则表达式进行匹配,并且可以设置资源路径,也可以根据HTTP返回码重定向页面。
上面的配置是针对静态Web服务器的,当我们需要使用反向代理处理请求时,我们在server配置块中的location中就不仅仅是返回静态的请求,而是通过代理将请求代理到上游服务器,location中反向代理的配置项如下
与代理配置项相关的是负载均衡配置块,通过upstream配置块,我们可以定义一组上游服务器,并且通过反向代理将请求代理到upstream定义的服务器组中,Nginx会根据负载均衡的算法代理到不同的上游服务器中。
与upstream相关的配置项如下
这里找了一份配置文件,方案作为配置项的参考
user testgroup testuser;
worker_processes 8;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
#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 logs/access.log main;
sendfile on;
# tcp_nopush on;
keepalive_timeout 65;
# gzip压缩功能设置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_types text/html text/plain text/css text/javascript application/json
application/javascript application/x-javascript application/xml;
gzip_vary on;
# http_proxy 设置
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
# 设定负载均衡后台服务器列表
upstream backend {
ip_hash;
server 192.168.10.10:8080 max_fails=2 fail_timeout=30s ;
server 192.168.10.11:8080 max_fails=2 fail_timeout=30s ;
}
# 虚拟主机配置
server {
listen 80;
server_name itoatest.example.com;
root /apps/oaapp;
charset utf-8;
access_log logs/host.access.log main;
#负载均衡与反向代理
location / {
root /apps/oaapp;
index index.jsp index.html index.htm;
proxy_pass http://backend;
proxy_redirect off;
# 通过该配置后端可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
#静态文件,nginx处理请求
location ~* /download/ {
root /app;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.10.0/24;
deny all;
}
location / {
deny all;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
#定义资源路径
root html;
}
}
}
上面讲的内容是基于HTTP模块的,自然也是基于七层应用代理的,我们都知道在OSI七层模型中,HTTP是属于应用层的,Nginx的Stream模块,支持Nginx做四层代理,也就是在传输层做代理,我们在HTTP模块之前可以定义Nginx的四层代理,其配置方法较为简单,与HTTP模块的配置方式极为相似,如下是一个简单的示例
stream {
server {
listen 18081;
proxy_pass testserver;
}
upstream testserver{
server 10.0.0.1:80 weight=5;
server 10.0.0.2:80 weight=5;
}
}
四层代理与七层代理的不同之处在于,四层代理不用等待HTTP请求解析和读取完成便可以直接代理到上层服务器,因此四层代理的速度是要快于七层代理的,但是,七层代理中根据HTTP请求的内容,可以做出更加丰富的操作。所以说可以根据实际的需求选择Nginx的代理方式。
文中的一些内容讲解得不够全面,Nginx的功能强大,写博客的时间有限,因此也做不到面面俱到,关于文中提到的内容,可以推荐给读者两本书,一本是《深入理解Nginx:模块开发与架构解析》,另一本是《精通Nginx(第2版)》。两本都是比较好的Nginx教材,特别推荐第一本。另外声明,文中的图片来自《精通Nginx》一书,很多配置项在第一本书中有更详细的讲解