发表于: 2020-03-12 23:06:47
1 1290
研究配置nginx 懵
#!/usr/bin/env bash
# 指定nginx worker进程运行用户以及用户组.
user www www;
# 使用cpu核心数 auto
worker_processes auto;
# 错误日志
error_log /www/wwwlogs/nginx_error.log crit;
# pid(进程标识符):存放路径。
pid /www/server/nginx/logs/nginx.pid;
# 指定进程可以打开的最大描述符:数目。
# 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
worker_rlimit_nofile 51200;
# 事件模块 控制Nginx处理连接的方式
events
{
# 使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
use epoll;
# 每个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
# 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
worker_connections 51200;
# multi_accept可以让nginx worker进程尽可能多地接受请求。它的作用是让worker进程一次性地接受监听队列里的所有请求,然后处理。
# 如果multi_accept的值设为off,那么worker进程必须一个一个地接受监听队列里的请求。
multi_accept on;
}
# 设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
# HTTP requset里面有一个头叫Accept,列出浏览器可以接受的mime type,HTTP response的Content-type的值再Accpet中
# Nginx会根据请求文件的扩展名来决定返回什么Content-type,除非后端web程序手动设置了Content-type
# 如没有,Nginx也没找到对应文件的扩展名的话,就使用默认的type
# mime type 和 文件扩展名的对应关系一般放在 mime.types
include mime.types;
#include luawaf.conf;
# 反向代理配置
include proxy.conf;
# 默认的type
default_type application/octet-stream;
# 保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的
# 参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数
# 在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能
# 如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2
# 第一次是确定存储单元的地址,第二次是在存储单元中查找键值
# 因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
server_names_hash_bucket_size 512;
# 客户端请求头部的缓冲区大小
# 这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小
# 分页大小可以用命令getconf PAGESIZE取得。
client_header_buffer_size 32k;
# 客户请求头缓冲大小
# nginx默认会用client_header_buffer_size这个buffer来读取header值
# 如果header过大,它会使用large_client_header_buffers来读取
large_client_header_buffers 4 32k;
# 设定通过nginx上传文件的大小
client_max_body_size 50m;
# sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on
# 如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime
sendfile on;
# 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
tcp_nopush on;
# keepalive超时时间
keepalive_timeout 60;
# 开启或关闭nginx使用TCP_NODELAY算法选项的功能
# 这个选项仅在将连接转变为长连接的时候才被启用 (译者注,在upstream发送响应到客户端时也会启用)
tcp_nodelay on;
# FastCGI服务
# 指定同FastCGI服务器的连接超时时间,这个值不能超过75秒。
fastcgi_connect_timeout 300;
# 指令为上游服务器设置等待一个FastCGI进程的传送数据时间
# 如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,那么可以修改这个值,如果你在上有服务器的error log里面发现一些超时错误,那么可以恰当的增加这个值
fastcgi_send_timeout 300;
# 前端FastCGI服务器的响应超时时间
# 如果有一些直到它们运行完才有输出的长时间运行的FastCGI进程,或者在错误日志中出现前端服务器响应超时错误,可能需要调整这个值
fastcgi_read_timeout 300;
# 指定nginx读取fastcgi响应第一部分需要用多大的缓冲区
# 这个值表示将使用一个64kb的缓冲区响应第一部分应答(应答头)可以设置为fastcgi_buffers缓存区大小
fastcgi_buffer_size 64k;
# 指nginx需要用多大的缓冲区缓冲fastcgi的应答请求(整个应答)
# 如果一个php脚本所产生的页面大小为256kb,那么会分配4个64kb缓冲区来缓存
# 如果页面大于256kb,那么大于256kb的部分会缓存到fastcgi_temp指定的路径中
# 但是因为内存中数据处理远快于磁盘,所以这个值应该为站点中php所产生的页面大小的中间值
# 如果站点大部分php脚本产生的页面为:256kb, 那么可以设置成成"8 16k 4 64k"
fastcgi_buffers 4 64k;
# 整个数据请求需要多大的缓存区,建议设置为fastcgi_buffers值的两倍
fastcgi_busy_buffers_size 128k;
# 写入缓存文件使用多大的数据块,默认值是fastcgi_buffer值的2倍
fastcgi_temp_file_write_size 256k;
# 当被代理的后端服务器的响应状态码大于等于300时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由error_page指令来处理
# 404页面
fastcgi_intercept_errors on;
# Gzip压缩 https://blog.csdn.net/jessonlv/article/details/8016284
# 开启或者关闭gzip模块
gzip on;
# 设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取
# 默认值是0,不管页面多大都压缩
# 建议设置成大于1k的字节数,小于1k可能会越压越大,即: gzip_min_length 1024
gzip_min_length 1k;
# 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流
# 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存
# 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存
# 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果
gzip_buffers 4 16k;
# 识别http的协议版本
# 由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的
# 注:21世纪都来了,现在除了类似于百度的蜘蛛之类的东西不支持自解压(百度就是SX,我就不说了)
# 99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可
gzip_http_version 1.1;
# gzip压缩比
# 1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)
gzip_comp_level 2;
# 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的
# 注意:如果作为http server来使用,主配置文件中要包含文件类型配置文件
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
# 和http头有关系,加个vary头,给代理服务器用的
# 有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,根据客户端的http头来判断,是否需要压缩
gzip_vary on;
# Nginx作为反向代理的时候启用
# 开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头
# 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_proxied expired no-cache no-store private auth;
# 使用正则表达式来指定某些不需要gzip压缩的浏览器(将和User-Agents进行匹配)
# 依赖于PCRE库,在0.6.23版本中首次使用
# 0.7.63版本以后,你可以为IE5.5和IE6 SP1使用msie6参数来禁止gzip压缩
gzip_disable "MSIE [1-6]\.";
# 访问限制模块
# 限制每个IP的连接数 perip perserver 是 server中定义的
limit_conn_zone $binary_remote_addr zone=perip:10m;
# 限制连接到服务器的连接总数
limit_conn_zone $server_name zone=perserver:10m;
# 隐藏nginx的版本号
server_tokens off;
# 用来指定日志文件的存放路径
access_log off;
# nginx的upstream目前支持4种方式的分配
# 1、轮询(默认)
# 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
# 2、weight
# 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
# upstream bakend {
# server 127.0.0.1:8027;
# server 127.0.0.1:8028;
# server 127.0.0.1:8029;
# hash $request_uri;
# }
# 3、ip_hash
# 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
# 例如:
# upstream bakend {
# ip_hash;
# server 192.168.0.14:88;
# server 192.168.0.15:80;
# }
# 4、fair(第三方)
# 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
# upstream backend {
# server server1;
# server server2;
# fair;
# }
# 5、url_hash(第三方)
# 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
# 例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
# upstream backend {
# server squid1:3128;
# server squid2:3128;
# hash $request_uri;
# hash_method crc32;
# }
#
# tips:
# upstream bakend{#定义负载均衡设备的Ip及设备状态}{
# ip_hash;
# server 127.0.0.1:9090 down;
# server 127.0.0.1:8080 weight=2;
# server 127.0.0.1:6060;
# server 127.0.0.1:7070 backup;
# }
# 在需要使用负载均衡的server中增加
# proxy_pass http://bakend/;
# 每个设备的状态设置为:
# 1.down表示单前的server暂时不参与负载
# 2.weight为weight越大,负载的权重就越大。
# 3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
# 4.fail_timeout:max_fails次失败后,暂停的时间。
# 5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
#
# nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
# client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
# client_body_temp_path设置记录文件的目录 可以设置最多3层目录
# location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
# 任务二
server
{
# 配置监听端口
listen 80;
# 配置访问域名
server_name liuhuan.ml;
# 设定访问的默认首页地址
index index.html index.htm index.jsp;
# 设定网站的资源存放路径
root /www/server/tomcat/;
location / #所有jsp的页面均交由tomcat处理
{
index index.jsp;
#转向tomcat处理
proxy_pass http://localhost:8080/;
}
# 设定访问静态文件直接读取不经过tomcat
location /js {
expires 1h;
}
# 设定访问日志的存放路径
# access_log /www/server/tomcat/taskTwo/logs/liuhuan.ml.access.log access;
}
include /www/server/panel/vhost/nginx/*.conf;
}
通过Nginx配置结构来理解nginx的运行逻辑.
Nginx的配置文件在逻辑上的组织为若干个相互嵌套和包含的结构,我们把每一个这样的结构统称为域(Context). 每当Nginx接收到客户端发来的HTTP请求,都会在配置文件中寻找其对应的域.
一. 域(Context)
如果你查看Nginx的主配置文件(如/etc/nginx/nginx/conf),你会发现每个域倒是由 { 和 } 包裹起来的数据集,它们类似于树结构进行组织. 每个域内部包含多条指令. 如果一个域被另外一个域包含, 上一级域指令会被传递到下一级. 使用域指令是配置Nginx的主要方式.
Nginx的所有指令: http://nginx.org/en/docs/dirindex.html
二. Main 域
Main域就就是全局环境,所有 {} 的最外面就是Main域,在Nginx配置中, Main域的位置就像下面这样:
# 这里就是 Main 域,处于所有域的外面
...
context {
...
}
任何出现在Main域的指令都被称之为 "全局指令". 需要注意的是一般我们会将每个server的配置分开写到 conf.d/*.conf 或者server/*.conf , 在这些文件里, 可能有一些指令是在所有的 {} 外面, 但实际上他们并不是全局指令, 因为他们会在 /etc/nginx/nginx.conf文件中使用 include 指令被引入.
Main域可以用来存放一些全局的指令. 全局的指令的值会为子域提供默认值, 子域也可以根据需要对相应的指令进行重载.
三. Events 域
Events域是Main域的一个子域, 在Nginx的配置中只能有一个Events域. Nginx使用基于时间的处理模型, 因此Events域一般用于指定Nginx工作进程(Worker Process)处理连接的方式, 例如同时处理的连接数, 以及一些负载均衡相关的设置.
ps -ef | grep nginx
# 这里是 Main 域,也就是我们的全局环境
events {
# 这里是 events 域,只可以存在一个events域,在这里指定worker处理连接的方式
...
}
默认情况下, Nginx会选择当前平台下最有效的连接处理方式, 例如在Linux平台下, Nginx会选择 epoll 作为处理连接的方式.
四. Http 域
除了Events域以外, Http域也是Main域的一个子域. Http域包含所有用于处理HTTP/HTTPS请求的指令, 如果我们希望让Nginx作为一个Web服务器或者反向代理服务器, 那么Http域是必不可少的.
和Events域一样, Http只能是Main域的子域.
# 这里是 main 域,也就是我们的全局环境
events {
# 这里是 events 域,只可以存在一个events域,在这里指定worker处理连接的方式
...
}
http {
# 这里是 http 域,记录所有和HTTP/HTTPS相关的Nginx指令
}
Http 域一般只用来保存和Http请求相关的全局配置. 因为在同一台机器上可能同时部署了多个Http服务器,为了隔离不同服务器的配置, Nginx使用Server域来区分不同的服务器.
在Http域中可以设置的默认值包括:
- 相关的日志文件的保存位置(access_log,error_log)
- 文件的异步I/O操作(aio, sendfile, directio)
- 服务器不同状态码对应的页面(error_page)
- 压缩选项(gzip和gzip_disable)。
Server 域
Server域是Http域的子域, Nginx允许同时定义多个Server域, 他们在Nginx配置文件中的位置关系看起来就可下面的配置文件一样.
# 这里是 main 域,也就是我们的全局环境
events {
# 这里是 events 域,只可以存在一个events域,在这里指定worker处理连接的方式
...
}
http {
# 这里是 http 域,记录所有和HTTP/HTTPS相关的Nginx指令
server {
# 这里是 server 域,每个 server 域在逻辑上代表了当前机器上的一个HTTP服务器
}
server {
# 这里是 server 域,每个 server 域在逻辑上代表了当前机器上的一个HTTP服务器
}
...
}
每个Server域在逻辑上代表了当前机器上的一个HTTP服务器, 同一个Nginx可以同时运行多个HTTP服务器. Nginx会自动为每一次请求选择合适的HTTP服务器.
对于Server域来说, 最重要的两个指令就是 listen 和 server_name:
listen: 指定当前Server响应的地址(IP 和 端口), 如果从指定的地址接收到HTTP请求, 那么Nginx会将请求发送给对应的Server处理. 可以使用 0.0.0.0 值告诉该服务器响应来自任意IP的请求.
server_name: 指定当前Server绑定的域名, 如果多个Server有相同的 listen 值, 那么Nginx会进一步尝试匹配这个字段.
<span server<="" span="" style="word-break: break-all;">{
listen 80; # 响应任意IP对80端口的请求
}
<span server<="" span="" style="word-break: break-all;">{
listen 192.168.10.103:80; # 只响应来自192.168.10.103的HTTP请求
server www.lfwen.site; # 绑定域名
}
<span server<="" span="" style="word-break: break-all;">{
listen 0.0.0.0:80; # 响应任意IP对80端口的请求
server *.lfwen.site; # 使用通配符绑定域名
}
五. 如何选择Server处理请求
当Nginx接受到来自客户端的HTTP请求时,应该如何选择Server来处理这个请求? Nginx检查客户端的IP地址和访问的端口号, 根据每个Server提供的listen指令选择出匹配的Server.
listen 记录了每个Server选择响应的ip地址和端口, 如果一个Server没有指定的listen,则会使用默认值 0.0.0.0:80 (如果Nginx不是以root身份运行, 则默认值为 0.0.0.0:8080)
今日问题 难理解 各种域
评论