nginx 基础手动配置,也可以通过 nginx在线可视化配置 生成
Nginx 配置文件结构
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
全局块
写在一开始的配置,影响nginx
全局的指令。一般有运行nginx
服务器的用户组,nginx
进程pid
存放路径,日志存放路径,配置文件引入,允许生成worker process
数等。如
#user nobody; # 默认运行用户 编译时未指定的话为nobody
worker_processes 4; # Nginx主进程要开启多少个工作进程 一般为当前CPU核心数
worker_cpu_affinity 0001 0010 0100 1000; # 将每个进程绑定到CPU的每个核心上 可以略提高性能
#error_log logs/error.log; # 错误日志的位置 默认是安装目录下的logs/error.log
#error_log logs/error.log notice; # 可以在日志后面添加纪录级别
#error_log logs/error.log info; # 可选项有: [debug|info|notice|warn|error|crit]
#pid logs/nginx.pid; # pid文件路径 nginx -s 控制服务就是从这里读取主进程的PID
worker_rlimit_nofile 65535; # 指定文件描述符数量 增大可以让Nginx处理更多连接
# 还需要增大系统允许进程打开文件描述符的上限 ulimit -n 65536
events块
配置影响nginx
服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。如
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http块
可以嵌套多个server
,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type
定义,日志自定义,是否使用sendfile
传输文件,连接超时时间,单连接请求数等。如
http {
include mime.types; # 其他的block配置 可以通过include导入 这样可以很方便管理配置
default_type application/octet-stream; # 响应类型未定义content-type时 文件默认类型为二进制流
# mime.types中包含文件扩展名与文件类型映射表
#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 logs/access.log main; # 默认access.log的位置 以及使用main中定义的格式
client_max_body_size 20m; # 设置允许客户上传大小
client_header_buffer_size 32k; # 客户端请求 header_buffer大小 默认1k
large_client_header_buffers 4 32k; # 指定客户请求header_buffer的缓存最大数量和大小
sendfile on; # 开启高效的文件传输模式
tcp_nopush on; # 开启tcp_nopush和tcp_nodelay用于防止网络阻塞
tcp_nodelay on;
#keepalive_timeout 0;
keepalive_timeout 65; # 客户端连接后保持连接的超时时间
client_header_timeout 10; # 设置客户端请求头读取超时时间
# 超时将返回Request time out (408)
client_body_timeout 10; # 设置客户端请求主体读取超时时间 超时也将返回408
send_timeout 10; # 指定响应客户端的超时时间
# 如果超过这个时间 客户端没有任何活的 Nginx将关闭连接
gzip on; # 开启还是关闭gzip模块 on表示开启 实时压缩输出数据流
gzip_min_length 1k; # 允许压缩页面最小字节数 小于1k的文件可能越压越大
gzip_buffers 4 16k; # 申请4个单位16KB的内存做压缩结果流缓存 默认源文件大小
gzip_http_version 1.1; # 用于识别HTTP协议版本 默认 1.1
gzip_comp_level 2; # 压缩等级 1 表示最快压缩 但压缩比最小 9反之
gzip_types text/plain application/x-javascript text/css application/xml; # 指定压缩类型
gzip_vary on; # 让前端的缓存服务器缓存经过gzip压缩的页面
# http_proxy 设置
# 故障转移策略,当后端服务器返回如下错误时,自动负载到后端其余机器
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
# 设置后端服务器获取用户真实IP、代理者真实IP等
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 用于指定客户端请求主体缓存区大小,可以理解成先保存到本地再传给用户
client_body_buffer_size 128k;
# 表示与后端服务器连接的超时时间,即发起握手等侯响应的超时时间
proxy_connect_timeout 90;
# 表示后端服务器的数据回传时间,即在规定时间之后端服务器必须传完所有的数据,否则 Nginx 将断开这个连接
proxy_send_timeout 90;
# 设置 Nginx 从代理的后端服务器获取信息的时间,表示连接建立成功后,Nginx 等待后端服务器的响应时间,其实是 Nginx 已经进入后端的排队中等候处理的时间
proxy_read_timeout 90;
# 设置缓冲区大小,默认该缓冲区大小等于指令 proxy_buffers 设置的大小
proxy_buffer_size 4k;
# 设置缓冲区的数量和大小。Nginx 从代理的后端服务器获取的响应信息,会放置到缓冲区
proxy_buffers 4 32k;
# 用于设置系统很忙时可以使用的 proxy_buffers 大小,官方推荐大小为 proxu_buffers 的两倍
proxy_busy_buffers_size 64k;
# 指定 proxy 缓存临时文件的大小
proxy_temp_file_write_size 64k;
...
}
代理部分也可以配置在server
中。
server 块
server
是在http
中的,用于配置虚拟主机的相关参数,一个http
中可以有多个server
。如
server { # server段就是虚拟主机的配置
listen 80; # 监听所有IP的80端口 可以指定单个IP
server_name localhost example.com;; # 用来指定IP地址或域名 多个域名间用空格分开
#charset utf-8;; # 用于设置网页默认编码
#access_log logs/host.access.log main; # 每一个虚拟主机也可以定义单独的access.log
location / { # URL地址匹配设置
root /var/www/html; # 网页根目录
index index.html index.htm; # 默认首页地址 会先寻找index.html 然后往后
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { # 匹配以这些格式结尾的请求
root /var/www/static; # 匹配到的请求从这个目录找文件
expires 30d; # 客户端缓存静态文件过期时间30天
}
error_page 404 /404.html; # 自定义404页面 /404.html为root指定的位置
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; # 自定义50x页面 到/50x.html
location = /50x.html { # 匹配50x页面的请求
root html; # 匹配到的请求从这个目录找文件
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
location ~ \.php$ { # 匹配php页面的请求
index index.php # 默认索引index.php
proxy_pass http://127.0.0.1 # 匹配到的请求转发到本机80端口处理
}
location ~ \.jsp$ { # 匹配jsp页面的请求
index index.jsp # 默认索引index.jsp
proxy_pass http://127.0.0.1:8080 # 匹配到的请求转发到本机8080端口处理
}
location /status { # 匹配status的请求
stub_status on; # 开启Nginx工作状态统计
access_log logs/status.log; # 状态统计页面访问日志
auth_basic "Nginx Status"; # 自定义提醒 认证界面会显示
auth_basic_user_file /var/www/htpasswd; # 认证密码文件 htpasswd工具由httpd提供
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
allow 192.168.10.100;
allow 172.29.73.0/24;
deny all;
} # 访问http://host/status 就可以看到状态统计了
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ { # FastCGI模式
# root /var/www/html; # php页面根目录
# fastcgi_pass 127.0.0.1:9000; # FastCGI监听地址 也可以使用unix套接字监听地址
# fastcgi_index index.php; # 索引文件
# fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; # php脚本全路径
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht { # 匹配ht开头的文件
# deny all; # 规则是全部拒绝
#}
}
location 块
location
是在server
中的,一个server
可以有多个location
,用于配置请求的路由,以及各种页面的处理情况。如实现动静分离,请求转发。
请求中带 /api/
的转发到 http://192.168.76.10:9000
;
server {
listen 80;
server_name localhost; #服务器域名
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
root html/default; #网页根目录(/usr/local/nginx/html/default/)
index index.html index.htm;
# autoindex on; # 开启索引
}
location /api/ {
proxy_pass http://192.168.76.10:9000;
proxy_set_header Host $host;
}
}
单独定义 html
页面、图片、js
脚本等静态资源入口,可简化访问路径
server {
listen 80;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
root html/default; #网页根目录(/usr/local/nginx/html/default/)
index index.html index.htm;
}
location /api/ {
proxy_pass http://192.168.76.10:9000; # 动态资源,后台接口
proxy_set_header Host $host;
}
location /image/ {
root html/default/static; # 静态资源 - 图片
# autoindex on;
}
location /page/ {
root html/default/static; # 静态资源 - html页面
# autoindex on;
}
}
如果请求这个 http://192.168.76.100/image/a.png
访问图片是 /usr/local/nginx/html/default/static/image/a.png
如果请求 http://192.168.76.100/static/image/a.png
访问图片 /usr/local/nginx/html/default/static/image/a.png
即 /usr/local/nginx/ + 配置的root目录 + URL中匹配的资源路径
root
后面的参数,如果是 / 开始,代表的是 linux
根目录下的目录,非 / 开始代表的是从 nginx
目录下开始
root
后面的参数,如果是 / 结尾,则 location
后面的参数,就不用以 / 开始,否则必须以 / 开始
upstream
在location
中有一个这个
location ~ \.jsp$ { # 匹配jsp页面的请求
index index.jsp # 默认索引index.jsp
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
而 mysvr
就是配置的 upstream
。和server
平级,一般用于负载均衡。
热备
如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
轮询
nginx
默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB....
upstream mysvr {
server 192.168.10.121:3333;
server 192.168.10.122:3333;
}
server {
....
location ~*^.+$ {
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
加权轮询
跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
ip_hash
nginx
会让相同的客户端ip
请求相同的服务器。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
关于nginx负载均衡配置的几个状态参数讲解。
down
,表示当前的server
暂时不参与负载均衡。backup
,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup
机器,因此这台机器的压力最轻。max_fails
,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream
模块定义的错误。fail_timeout
,在经历了max_fails
次失败后,暂停服务的时间。max_fails
可以和fail_timeout
一起使用。
upstream mysvr {
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
}
include
一个nginx
可以管理很多服务器,随着需要配置的东西越来越多,配置文件也越来越长。
所以为了简化文件,可以使用include
。
如把server
模块和对应的upstream
写在一个文件里,通过引入的方式,可以是配置文件更加清晰。如
# Load configs
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
完整示例
user root root; #使用什么用户启动NGINX 在运行时使用哪个用户哪个组
worker_processes 4; #启动进程数,一般是1或8个,根据你的电脑CPU数,一般8个
worker_cpu_affinity 00000001 00000010 00000100 00001000; #CPU逻辑数——把每个进程分别绑在CPU上面,为每个进程分配一个CPU
#pid /usr/local/nginx/logs/nginx.pid
worker_rlimit_nofile 102400; #一个进程打开的最大文件数目,与NGINX并发连接有关系
#工作模式及连接数上限
events
{
use epoll; #多路复用IO 基于LINUX2.6以上内核,可以大大提高NGINX的性能 uname -a查看内核版本号
worker_connections 102400; #单个worker process最大连接数,其中NGINX最大连接数=连接数*进程数,一般1GB内存的机器上可以打开的最大数大约是10万左右
multi_accept on; #尽可能多的接受请求,默认是关闭状态
}
#处理http请求的一个应用配置段
http
{
#引用mime.types,这个类型定义了很多,当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME #Type,根据MIMETYPE设置并response响应类型(Content-type)
include mime.types;
default_type application/octet-stream; #定义的数据流,有的时候默认类型可以指定为text,这跟我们的网页发布还是资源下载是有关系的
fastcgi_intercept_errors on; #表示接收fastcgi输出的http 1.0 response code
charset utf-8;
server_names_hash_bucket_size 128; #保存服务器名字的hash表
#用来缓存请求头信息的,容量4K,如果header头信息请求超过了,nginx会直接返回400错误,先根据client_header_buffer_size配置的值分配一个buffer,如果##分配的buffer无法容纳request_line/request_header,那么就会##再次根据large_client_header_buffers配置的参数分配large_buffer,如果large_buffer还是无#法容纳,那么就会返回414(处理request_line)/400(处理request_header)错误。
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_max_body_size 300m; #允许客户端请求的最大单文件字节数 上传文件时根据需求设置这个参数
#指定NGINX是否调用这个函数来输出文件,对于普通的文件我们必须设置为ON,如果NGINX专门做为一个下载端的话可以关掉,好处是降低磁盘与网络的IO处理数及#系统的UPTIME
sendfile on;
#autoindex on;开启目录列表访问,适合下载服务器
tcp_nopush on; #防止网络阻塞
#非常重要,根据实际情况设置值,超时时间,客户端到服务端的连接持续有效时间,60秒内可避免重新建立连接,时间也不能设太长,太长的话,若请求数10000##,都占用连接会把服务托死
keepalive_timeout 60;
tcp_nodelay on; #提高数据的实时响应性
client_body_buffer_size 512k; #缓冲区代理缓冲用户端请求的最大字节数(请求多)
proxy_connect_timeout 5; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 60; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_send_timeout 5; #后端服务器数据回传时间(代理发送超时)
proxy_buffer_size 16k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 64k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 128k; #高负荷下缓冲大小
proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
gzip on; #NGINX可以压缩静态资源,比如我的静态资源有10M,压缩后只有2M,那么浏览器下载的就少了
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2; #压缩级别大小,最小1,最大9.值越小,压缩后比例越小,CPU处理更快,为1时,原10M压缩完后8M,但设为9时,压缩完可能只有2M了。一般设置为2
gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型:text,js css xml 都会被压缩
gzip_vary on; #作用是在http响应中增加一行目的是改变反向代理服务器的缓存策略
#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #ip 远程用户 当地时间 请求URL
'$status $body_bytes_sent "$http_referer" ' #状态 发送的大小 响应的头
'"$http_user_agent" $request_time'; #客户端使用的浏览器 页面响应的时间
#动态转发
upstream web1 {
#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。配置了ip_hash就没有负载均衡的效果了,每次访问的都是同一个tomcat
#ip_hash;
#转发的后端的tomcat服务器,weight表示转发的权重,越大转发的次数越多,机器性能不一样配置的weight值不一样
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
}
upstream web2 {
server 127.0.0.1:8090 weight=1 max_fails=2 fail_timeout=30s;
server 127.0.0.1:8091 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80; #监听80端口
server_name www.dbspread.com; #域名
index index.jsp index.html index.htm;
root /usr/local/nginx/html; #定义服务器的默认网站根目录位置
#监听完成以后通过斜杆(/)拦截请求转发到后端的tomcat服务器
location /
{
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host; #获取客户端的主机名存到变量Host里面,从而让tomcat取到客户端机器的信息
proxy_set_header X-Real-IP $remote_addr; #获取客户端的主机名存到变量X-Real-IP里面,从而让tomcat取到客户端机器的信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web1; #跳转到对应的应用web1
}
# location ~ .*\.(php|jsp|cgi|shtml)?$ #动态分离 ~匹配 以.*结尾(以PHP JSP结尾走这段)
# {
# 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_pass http://jvm_web2;
# }
#静态分离 ~匹配 以.*结尾(以PHP JSP结尾走这段),当然不是越久越好,如果有10000个用户在线,都保存几个月,系统托跨
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /var/local/static;
expires 30d;
}
#日志级别有[debug|info|notice|warn|error|crit] error_log 级别分为 debug, info, notice, warn, error, crit 默认为crit, 生产环境用error
#crit 记录的日志最少,而debug记录的日志最多
access_log /usr/local/logs/web2/access.log main;
error_log /usr/local/logs/web2/error.log crit;
}
}