我们从这张图开始分析nginx配置(借用网图)
user www; worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000 #error_log logs/error.log; #pid logs/nginx.pid; master_process on|off
woker_process auto 这里主要是nginx处理并发处理的关键配置,这么说可能不太明显,举个例子
可以看到,我们设置了auto,nginx就会自动产生适合的进程数量来处理并发,我们也可以把auto换成自己指定的数字,不过不太建议;这里当worker数和cpu的数量相等时获得最佳性能,因为每一个worder都会工作在独立的cpu核心上,完全消除了cpu调度
master_process 是否启用nginx的进程池机制,即是否产生worker进程
worker_cpu_affinity 指定某个woker进程绑定到某个核心上,更充分利用cpu资源,减少cpu切换,提升cache命中率
pid Nginx进程是作为系统守护进程在运行,需要在某文件中保存当前运行程序的主进程号,Nginx支持该保存文件路径的自定义
2.event块
nginx采用事件驱动,event就是用来配置nginx的事件机制,这里配置很少;
events { use epoll; //配置使用事件的处理方式,选择项包括:select、poll、kqueue、epoll、rtsig等,默认为epoll,不必配置 worker_connections number;//每个worker进程的最大连接数的配置 multi_accept on | off //是否允许同时接收多个网络连接 accept_mutex on | off; //是否启用进程间的负载均衡,可让进程工作更均匀,但使用锁成本较高影响效率,默认off }
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 0; keepalive_timeout 65; #gzip on; server { xxx }
include xx 后面跟的是文件名字,就是说允许网络资源的媒体类型,可以执行cat mimi.types,可以看到 这个文件是一个types结构,包含了各种浏览器能够识别的mime类型及对应的文件的后缀,如下图;
“=”:用于标准uri前,要求请求字符串与uri严格匹配,一旦匹配成功则停止
“~”:用于正则uri前,并且区分大小写
“~*”:用于正则uri前,但不区分大小写
“^~”:用于标准uri前,要求Nginx找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
其中应该注意的location / ,根据nginx的前缀匹配原则,会处理其他location处理不了的请求
server { charset utf-8; client_max_body_size 128M; listen 要监听的端口; server_name 域名; root 站点目录; index index.php或者index.html 就是入口; access_log 日志文件路径; error_log 日志文件路径; server_roken on|build|off HTTP响应头中的server字段,on会显示nginx版本,off会关闭 # 出现请求了不存在的文件或者错误时,跳转到index.php location / { # Redirect everything that isn't a real file to index.php try_files $uri $uri/ /index.php?$args; } # 支持php模块(遇到.php就用php模块去处理) location ~ \.php$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include fastcgi_params; } # 拒绝这些请求 location ~ /\.(ht|svn|git) { deny all; } }
6.TCP/UDP服务
stream{ upstream{ //配置上游服务器 } server{ listen 666 ;//监听TCP 666端口 } server{ listen 555 udp;//监听UDP 555 端口 } }
这里定义TCP/UDP服务器要使用server命令,listen制定监听的端口号,TCP/UDP协议里面没有Host ,Url概念,所以server块里面不能使用server_name,location等指令
7.反向代理
先解释下什么叫反向代理
在计算机网络中,反向代理是代理服务器的一种。服务器根据客户端的请求,从其关联的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在
upstream backend{ # upstream的名字 keepalived 32 # 最大连接数,连接池 zone shared_upstream_storage 64k # 允许集群信息在多个进程之间共享 server 127.0.0.1:80 # 上游服务器 或 server ... weight=3; # 指定多台上游服务器 或 server ... backup # 备份用的上游服务器 }
其中weight 表示访问的权重,比如我一台服务器设置1,一台设置为3 那么分发到这两台服务器的请求比例就为1:3
8.负载均衡
nginx支持以下策略
round robin 默认算法,带权重的轮询
hash 散列或者一致性散列算法生成指定范围的key
ip_hash 使用ip地址的散列
least_conn 选择负载最轻的服务器
random 带权重的随机算法
这里个人推荐4,5两种,使用random使用two随机选择2个服务器,然后使用least_conn得到负载最小的一个,可避免羊群效应(存在多个节点时)
upstream{ random two; server 127.0.0.1:80 #第一台服务器 server ... weight=3 #第二台服务器 }
注意,有时候,同一个客户端的请求要转发到同一台服务器(各节点之间未做session共享),目前的nginx不支持,但是可以用其他第三方模块实现此功能
使用upstream 配置了上游集群和负载均衡之后,我们就可以在location或者serverz中用proxy_pass把客户端的请求转发到后端了,实现反向代理功能,如下面的额第九条
9.代理转发
location /abc/ { proxy_set_header Host $host; #转发请求的原始头 proxy_pass http://127.0.0.1:8080; # url遇到abc 转发请求到8080端口 或 proxy_pass http://backend; #转发upstream块定义的服务器集群 }