1.Nginx.conf相关介绍
Nginx.conf文件是Nginx核心配置文件,很多Nginx设置,都是在这里进行定义。废话不多说,先看下Nginx.conf整体结构。
Nginx.conf文件位于conf目录下,大致分为4块,分别是main(全局设置),server(主机设置),upstream(上游设置),location(url匹配)。**
main:主要提供全局设置功能,其中的指令会影响其他模块的所有设置其中events及http就属于此模块。
server:主要是对主机进行设置,比如端口,域名设置等等。server是继承了main指令。
upstream:主要用于与后端的交互,设置反向代理等等。upstream属于独立的模块,既不会继承指令也不会被继承,有自己的特色指令。
location:主要是提供网页匹配,正则等等,任务很重的。location会继承server指令。
2.Nginx.conf参数介绍:
#全局配置
user www www; #指定Nginx用户,可以是www,nginx,随便,但是用户在系统的存在即可
worker_processes 8; #工程进程数,根据cpu核数来调整,有的说是1.5-2倍,适应啥场景就不知道了,拿不准的感觉可以调auto
error_log /data/logs/nginx/nginx_error.log warn; #错误日志存放路劲
pid /var/run/nginx.pid; #设置pid,一般设置/var目录下面
worker_rlimit_nofile 65535; #指定进程可以打开最大描述符,最好与系统的一致,
#系统支持文件最大打开数是65535,其中ulimit -n可以进行查询,如果没有直接运行下面2条命令,永久设置
echo "* soft nofile 65535" >> /etc/security/limits.conf 其中*代表所有用户
echo "* hard nofile 65535" >> /etc/security/limits.conf
events {
use epoll; #好像是事件模型,具体是啥,我也是蒙圈的,Linux系统选择epoll即可
worker_connections 10240; #设置单个进程允许的客户端最大连接数。服务器最大并发量:worker_processes*worker_connections
multi_accept on; #设置一个进程同时是否可以接受多个连接,默认是off(也就是一个进程同时只能接受一个连接),为on就可以同时接受所有连接(优化的)
}
http {
include mime.types; #设定mime类型,有就是Nginx支持的媒体类型。
default_type application/octet-stream; #设置默认媒体类型
#charset utf8; #设置默认字符集为utf8(wwindows的机器默认字符集是gbk,代理windows的时候优着点)
server_tokens off; #隐藏版本号(优化),默认是on
#服务器重定向
server_name_in_redirect off; #服务器重定向,如果为on,则使用serve_name第一个值(也就是第一定义的server_name)进行重定向,为off,Nginx直接截取请求的header头部信息。(默认是开启的)
server_names_hash_bucket_size 128; #serve_name的hash表大小。
client_header_buffer_size 4k; #默认缓冲客户请求header头部大小
large_client_header_buffers 4 4k; #最大使用4个单位4k大小缓冲区来存储herader头部信息
client_max_body_size 120m; #设置客户端请求最大文件数,进行文件上传等业务,就得根据实际情况设置限制值
client_body_buffer_size 120m; #设定缓存区大小,主要是存放用户上传的数据,太小的话会频繁写进磁盘,影响性能,太大就没有多大的意义。
#磁盘优化
sendfile on; #开启高效传输模式,磁盘I/O不大的时候设置为on,下载类业务多导致磁盘I/O高的时候建议off。
tcp_nopush on; #防止网络阻塞,积极减少网络报文的数量,此选项仅在使用sendfile的时候使用
#fastcgi优化(为了改善网站的性能:减少资源占用,提高访问速度。)
fastcgi_connect_timeout 300; #设置连接到后端fastcgi的超时时间
fastcgi_send_timeout 300; #设置向fastcgi发送请求的超时时间(指的是已经经过2次握手向fastcgi传送请求时间)
fastcgi_read_timeout 300; #设置接收fastcgi应答超时时间(值的是经过2次握手之后接收fastcgi的应答时间)
fastcgi_buffer_size 32k; #指定将用多大的缓冲区来读取fastcgi应答的第一部分(应答头),这里是使用32kB来响应
fastcgi_buffers 32 32k; #设置本地将用多少及多大的缓冲区来读取fastcgi应答请求
fastcgi_busy_buffers_size 64k; #建议设置为fastcgi的2倍,
fastcgi_temp_file_write_size 128k; #设置在写入fastcgi_temp_path时将用多大的数据库,默认值是fastcgi_buffers 2倍。
#关于fastcgi的一些相关介绍
#gzip压缩模块
gzip on; #开启gzip压缩(此模块已内置)
gzip_min_length 1k; #设置压缩页面最小的字节数,默认值为0,代表页面无论大小都压缩,小于1k经过压缩反而更大。
gzip_buffers 4 16k; #设置压缩缓冲区大小,表示用4个16k大小内存空间处理请求压缩请求
gzip_http_version 1.0; #压缩版本(默认是1.1,前端为squid 2.5时用1.0),主要用来识别http协议版本,意思就是在http 1.0版本也可以其压缩功能.
gzip_comp_level 6; #设置压缩比率,1,压缩比最小,速度最快,9为压缩比最大,速度最慢,但是传输速度快,比较消耗cpu资源
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; #压缩类型,选择默认吧
gzip_proxied expired no-cache no-store private auth; #在Nginx作为为反向代理的时候使用,有9个值
off – 关闭所有的代理结果数据压缩
expired – 如果header中包含”Expires”头信息,启用压缩
no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
private – 如果header中包含”Cache-Control:private”头信息,启用压缩
no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
any – 无条件压缩所有结果数据
gzip_disable "MSIE [1-6]\."; #不对哪些数据进行压缩
#设置日志格式
log_format jflog '$remote_addr | $remote_user | $time_local | $request | $status | '
'$bytes_sent | $body_bytes_sent | $host | $http_referer | $http_user_agent | '
'$upstream_addr | $gzip_ratio | $http_x_forwarded_for | $request_time | $upstream_response_time';
#具体日志信息请参考 ()
#设定静态文件缓存(优化)
open_file_cache max=65535 inactive=20s; #为打开文件指定缓存
max:指定缓存数量(最好与ulimit -n结果一致),
inactive:指多长时间没被请求则删除缓存信息。
off:禁用此功能,默认是没有开启的
open_file_cache_valid 30s; #多长时间检查缓存信息
open_file_cache_min_uses 2; #指定缓存文件在inactive设定时间内的打开次数,满足2次及以上则一直缓存,否则将被干掉。
open_file_cache_errors on; #是否缓存错误信息,on为开启,yes为关闭
#设置与后端的超时时间
proxy_connect_timeout 300; #设置与后端连接的超时时间(默认是60s)
proxy_send_timeout 300; #指定向后端写数据的超时时间(默认是60s)
proxy_read_timeout 300; #指定从后端读数据的超时时间(默认是60s)
#缓冲缓存(主要用于反向代理)
proxy_buffering on; #是否启用缓冲缓存
proxy_buffer_size 32k; #设置缓冲区大小(后端回复结果的首段信息)
proxy_buffers 128 32k; #设置缓冲区数量跟大小,后端响应(数据)会先放到这里,
128是指个128单位,请求数量,32k,指每个缓冲区大小,值越大,代表可以缓冲的版内容越多。
proxy_busy_buffers_size 256k; #指在忙到时候,单个缓冲区大小可以扩展到256k
proxy_temp_file_write_size 256k; #当响应大于此值时,Nginx直接写入临时文件
注:缓冲缓存主要是为解决用户访问量大,频繁读取后端数据,从而大量消耗服务器性能的问题,
开启缓冲缓冲,用户是直接从代理服务器上获取数据,而不是直接从后端获取数据,
并且代理服务器首先会缓存后端发来的数据,在用户需要的时候,直接返回给用户,
从而达到降低代理服务器性能消耗的目的。在访问量不大的时候,用户可以直接跟后端服务器交互,对服务器性能没啥影响,建议开启。
# 这篇博客大佬,充分的细说了客户端发起请求及响应请求的全过程,我总结的都没别人的好,还是看原篇。
#开启反向代理
upstream unix__tmp_php_cgi_sock {
server unix:/tmp/php7-cgi.sock weight=100 max_fails=5 fail_timeout=30;
#server unix:/tmp/php-cgi2.sock weight=100 max_fails=5 fail_timeout=30;
#server unix:/tmp/php-cgi3.sock weight=100 max_fails=5 fail_timeout=30;
# 禁止未授权访问
server {
listen 80 default_server;
server_name _; #设置这个的话,意思就是后面的server配置里面直接访问域名返回403
# 监控 nginx 状态
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
location / { #看需求(如果不给用户访问/目录的话可以禁止掉)
return 444;
}
access_log off; #看需求,有的服务是需要开启访问日志的
}
include vhost/*.conf; #定义虚拟主机所在地方
}
upstream
##介绍
upsteam主要提供后端代理等功能,可以实现反向代理,负载均衡等功能。upstream主要是通过轮询的方式进行负载,根据权重,请求时间顺序按照一定的规则一一将用户请求转到后方服务,从而分担各种服务器的压力。
##组成结构
upstream 描述 {
描述(server/www) 服务路劲(ip:端口/Unix:sock路劲) 分配策略 可选参数;
}
第一字段:我的理解是描述 可以是server /www等等
第二字段:服务路劲(可以是ip加端口/sock路劲都行)
第三字段:分配策略(weriht 权重,权重越高,负载的权重就越大;down 不参与此次负载; backup,当非backup或者down主机繁忙的时候,能请求支援,减小压力)
第四字段:就是常见参数,max_fails 发起请求失败次数,当请求失败超过当前值的时候返回proxy_next_upstream 模块定义的错误;fail_tiemout是暂停多久的意思,得根据max_fails结果来判断。
还有些其他的用法:
upstream favresin{
ip_hash; #设置此值,代表每一请求按访问的ip的hash结果分配,就可以访问固定的后端服务器,解决session(百度有解释,我也不懂)的问题。
server 10.0.0.10:8080;
server 10.0.0.11:8080;
}
upstream favresin{
server 10.0.0.10:8080;
server 10.0.0.11:8080;
fair; #按照服务器后端的响应时间来分配请求,响应时间越短的能优先处理客户请求。
}
upstream resinserver{
server 10.0.0.10:7777;
server 10.0.0.11:8888;
hash $request_uri; #按照访问url的hash结果来分配请求,使每一个url都重定向到同一个后端服务器
hash_method crc32; #注意:在upstream中加入hash语句。server语句中不能写入weight等其他的參数,hash_method是使用的hash算法。
}