nginx 简介和通用配置
简介
nginx是web服务器,由C语言开发,基于事件驱动能处理百万级别的tcp连接,高度模块化的设计和自由的许可证使得扩展其功能的模块层出不穷,跨平台,可使用当前操作系统特有的一些高效API来提高自己的性能,nginx以性能为王。选择nginx的核心理由是处理高并发请求的同时保持高效的服务。
优点
- 更快
单次请求更快,高峰期也更快
- 高扩展性
极具扩展性,它由多个不同功能、不同层次、不同类型且耦合度极高的模块组成,这种低耦合的设计,造就了它庞大的第三方模块
- 高可靠性
每个worker进程相对独立,master进程在某个worker进程出错时能迅速拉起新的worker进程,nginx的可靠性来源于其核心框架代码的优秀设计、模块设计的简单性。官方提供的常用模块都很稳定。
- 低内存消耗
一般情况下10000个非活跃的keep-alive连接仅消耗2.5M的内存
- 单机支持10万以上的并发连接
nginx支持的并发连接上限取决于内存,10万远没封顶
- 热部署
master管理进程
worker工作进程
- 最自由的BSD许可协议
nginx 配置一般分为6大块,多数http中的配置都可以配置到server和location中
1、全局块: 配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块: 配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块: 可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、upstream: 配置代理服务,在http 模块下,通过server端调用
5、server块: 配置虚拟主机的相关参数,一个http中可以有多个server
6、location块: 配置请求的路由,以及各种页面的处理情况
下面是一份通用的nginx配置
# nginx 使用的用户和组
user www www;
# worker角色的工作进程的个数,这个数值简单一点可以设置为cpu的核数grep ^processor /proc/cpuinfo | wc -l,也是auto值
worker_processes auto;
# 指定全局日志路径和文件名,可以在下方直接使用 [ debug | info | notice | warn | error | crit ] 参数
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 指定 pid 存放的路径
pid logs/nginx.pid;
events {
# nginx默认使用epoll事件模型,: use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];具体内容查看 http://wiki.codemongers.com/事件模型
use epoll;
# 每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)
worker_connections 2048;
# 打开同时接受多个新网络连接请求的功能。 默认为off
# multi_accept on;
# 优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒,默认为off
# accept_mutex on;
}
http {
# 文件扩展名与文件类型映射表,设定mime类型,类型由mime.type文件定义
include mime.types;
# 配置默认的mime类型
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;
# 开启高效文件传输模式,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off
sendfile on;
# socket包累计到一定大小后就发送
# tcp_nopush on;
# 强制socket在它的缓冲区里0.2秒后发送数据,tcp_nopush 配置和 tcp_nodelay "互斥"
# tcp_nodelay on;
# 长连接超时时间,单位是秒
keepalive_timeout 65;
# 【gzip压缩功能设置】:gzip和gzip_static模块可以搭配使用,也可独立使用,gzip内置,gzip_static官方说不内置,上下文:http,server,location,可以使用nginx -V 来查看是否安装某个模块
# 是否开启gzip, 默认off,符合条件的都要压缩,使用建议搭配缓存
# gzip on;
# 是否开启 gzip_static, 默认off,会在同路径下先找寻同名.gz压缩文件,找到直接返回,未找到,压缩后返回,建议手动压缩
gzip_static on;
# 当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。根据具体情况修改
gzip_min_length 3k;
# 缓冲(压缩在内存中缓冲几块? 每块多大?),32 4K| 16 8K,建议用默认
# gzip_buffers 4 16k;
# 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议),1.0|1.1,默认1.1,如果是反向代理,考虑使用1.0
gzip_http_version 1.0;
# 设置请求者代理服务器,该如何缓存内容,off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any, 默认:off
# gzip_proxied any
# 推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_comp_level 6;
# 对哪些类型的文件用压缩 如txt,xml,html ,css
# gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
# 增加响应头”Vary: Accept-Encoding”
gzip_vary on;
# 【http_proxy 设置】 上下文:http,server,location
# 限制请求体的大小,若超过所设定的大小,返回413错误。默认1m
client_max_body_size 30m;
# 分配给请求数据的Buffer大小,请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中,临时文件路径为client_body_temp
client_body_buffer_size 128k;
# 请求的数据的临时目录,默认/tmp ,修改必须保证nginx具有读写权限
# client_body_temp /tmp
# 连接代理服务器的超时时间,单位秒
proxy_connect_timeout 75;
# 代理服务器处理请求的超时时间,单位秒
proxy_read_timeout 75;
# 代理服务器数据回传超时时间,单位秒
proxy_send_timeout 75;
# 代理服务器错误是否开启拦截
proxy_intercept_errors on;
# 开启从后端被代理服务器的响应body缓冲, on|off, 默认on
# proxy_buffering on
# Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。默认值:proxy_buffer_size 4k/8k
proxy_buffer_size 4k;
# 设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小。开辟4个长度为32k大小的read_buf用来存储body,当然不是连接建立初始化时就开辟4个,而是当当前buf不够存响应body时才会新申请一个,最多申请4个buf; 默认值:proxy_buffers 256 8k
proxy_buffers 4 32k;
# nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给客户端;如果完整数据大小不小于busy_buffer大小,则装满busy_buffer后,马上传给客户端;
proxy_busy_buffers_size 64k;
# 设置临时文件的总大小,默认值:proxy_max_temp_file_size 1024m;
proxy_max_temp_file_size
# 同时写入临时文件的数据量的总大小。通常设置为8k或者16k。
proxy_temp_file_write_size 64k;
# 定义proxy的临时文件存在目录以及目录的层级。语法:proxy_temp_path path [level1 level2 level3],默认值proxy_temp_path proxy_temp
# proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
# 设定负载均衡后台服务器列表,service:反向服务地址 加端口,weight:权重,max_fails:失败多少次 认为主机已挂掉则,踢出,fail_timeout:踢出后重新探测时间,backup:备用服务,max_conns:允许最大连接数,slow_start:当节点恢复,不立即加入,down:表示单前的server暂时不参与负载.
upstream backend {
# 负载均衡的分配策略,ip_hash;|fair;|hash $request_uri; hash_method crc32; ,默认按照轮询和权重(weight)
ip_hash;
# 负载的服务器ip、端口和一些配置参数
server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ;
server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
# 指定可用于长连接的连接数
# keepalive 16;
}
# 【虚拟主机配置】 也可以 include /etc/nginx/sites-enabled/*; 通过外部引入
server {
# 监听80端口
listen 80;
# 设置访问的域名
server_name host.example.com;
# 设置主机的根目录
root /var/www/html/oaapp;
# 设置编码格式
charset utf-8;
# 设定本虚拟主机的访问日志
access_log /tmp/host.access.log main;
# 设定本虚拟主机的错误日志
error_log /tmp/host.error.log error;
#对 /proxy 所有做负载均衡+反向代理
location /proxy{
# 匹配路 由根目录
root /var/www/html/oaapp;
# 入口文件
index index index.php index.jsp index.html index.htm;
# 请求转向backend定义的服务器列表,即反向代理
proxy_pass http://backend;
# 语法:proxy_redirect [ default|off|redirect replacement ] 默认值:proxy_redirect default 使用字段:http, server, location
# proxy_redirect off;
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host:$server_port;
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;
}
# 这.php文件的处理交给php-fpm
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
# 设置404状态的重定向页面,可以指定本地也可以是远程url
error_page 404 /404.html;
location = /404.html {
access_log logs/access.log maintry;
proxy_pass http://192.168.10.100:8080/error404.php;
}
# 设置50x错误的重定向页面,可以指定本地也可以是远程url
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
}
}