1. 首页
  2. Nginx

Nginx 配置文件详解及优化

#定义Nginx运行的用户和用户组,可以设置登录shell 为/sbin/nologin
user www www;
#启动进程,通常设置成和cpu的数量相等
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
worker_rlimit_nofile 102400;
#该指令是当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
设置Linux文件描述符(ulimit -n 1000000),最大 1048576;
文件描述符:
内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。
内核可以在同一时间可以打开socket文件的数量。
查看端口接受状态
netstat -antp
tcp 0 0 10.0.0.6:80<<<<<<10.0.0.7:37882 ESTABLISHED 50480/nginx: worker
10.0.0.6:80<<<<10.0.0.8:30050
查看进程打开的文件描述符处理请求
cd /proc/50480/fd
/proc :Linux服务器状态的信息存放目录(动态更新)
端口一共有65535个基础端口,TCP/UDP 四层端口
对于客户端,你需要有一个local port(10.0.0.7:56666) 来接收服务端发来的数据;而服务端就都使用相同的端口,那就是listen 的port(10.0.0.6:80)。
这样,在服务端(nginx)看到的socket,就都会是服务端口为80或者443的;这个时候,nginx进程能够处理的socket数量,就仅仅受限于服务端对进程fd(文件描述符)数量的限制。如果你设置为unlimited,则这个限制就仅仅受限于操作系统的内存大小了。
#全局错误日志及PID文件
error_log /usr/local/nginx/logs/error.log info;
#错误日志定义等级,[ debug | info | notice | warn | error | crit ]
从前到后,级别越高,信息越少,debug 代表信息最多,逐级递加,crit 是信息最少。灾难性的问题才会显示在crit里面。生产环境建议配置warn。
关闭错误日志 error_log /dev/null;
日志配置段可以配置全局、http、server、location 段中。同一个段中只允许出现一个error_log。
pid /usr/local/nginx/nginx.pid;
记录主进程的pid文件。
events {
use epoll; 配置epoll模型,默认也是epoll。
Nginx服务器响应和处理Web请求的过程,就是基于事件驱动模型的,事件驱动处理库又被称为多路IO复用方法,最常见的包括以下三种:select模型,poll模型和epoll模型。
请求处理是跟网络的I/O模型相关的,在计算机系统中I/O就是输入(Input)和输出(Output)的意思。
网络I/O是用户态和内核态之间的数据交换。
用户发送请求给网卡eth0,请求发给ip:80,由端口应用进程通过系统调用(read)->由用户态转到内核态->内核将请求的数据发送到内核缓冲区->应用进程查看内核缓冲区是否有数据->如果有则把数据拷贝到用户态->完成I/O操作,5个IO处理模型:
    1.阻塞IO blocking IO
    2.非阻塞IO nonblocking IO
    3.IO多路复用 IO multiplexing  (select, poll, epoll 都是I/O多路复用的具体的实现)
    4.信号驱动IO signal driven IO
    5.异步IO asynchronous IO
work_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections
worker_connections 10240; 10240 * 8 = ***
multi_accept on;
#尽可能多的接受请求.默认是开启的, 使每个worker进程可以同时处理多个客户端请求
}
http {
#设定http服务器,利用它的反向代理功能提供负载均衡支持
include mime.types;
#设定mime类型,类型由mime.type文件定义
#定义nginx能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等)
default_type application/octet-stream;
#默认的type 类型,也是推送调用浏览器默认功能。
access_log /usr/local/nginx/log/nginx/access.log;
#设定日志路径
charset UTF-8;
#设定请求头中默认字符集;
curl -I https://www.wzstyle.cn
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 12 Jun 2020 03:07:46 GMT
Content-Type: text/html; charset=UTF-8
sendfile on;
#sendfile 指令指定 nginx 是否调用 sendfile 函数,调用函数,会加速访问,sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。
Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效。
lscpu 可以查看cpu的内部缓存。
会在CPU的缓存区生成函数调用,加速tcp socket的请求。
#autoindex on;
#开启目录列表访问,合适下载服务器,默认关闭。nginx下载服务器使用。
tcp_nopush on;
#防止网络阻塞。当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。这样有助于解决网络堵塞问题。调用一个tcp_cork方法调用。
keepalive_timeout 65;
#keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后继请求时,keepalive-timeout功能可避免建立或重新建立连接。(节省服务器资源、CPU、内存、网卡)
#开启gzip压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 128k;
gzip_http_version 1.1;
gzip_comp_level 4; #调整这个参数测试
#压缩级别大小,最大为9,值越小,压缩后比例越小,CPU处理更快。
#值越大,消耗CPU比较高。
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
client_max_body_size 10m;
#允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;
#缓冲区代理缓冲用户端请求的最大字节数.
proxy_connect_timeout 300;
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 300;
#后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 300;
#连接成功后,后端服务器响应时间(代理接收超时)
以上三个超时时间如果超过了既定时间就会返回502 错误。
proxy_buffer_size 4k;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;
#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 128k;
#高负荷下缓冲大小(proxy_buffers*2)
#设定请求缓冲
large_client_header_buffers 4 16k;
client_header_buffer_size 4k;
#客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k
#不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
linux 操作系统中buffer 和 cache 的作用:
Buffer 和 cache (它们都是占用内存)。
Buffer 缓冲区: 是块设备的读写缓冲区,buffer 是I/O 缓存,用于内存和硬盘(或 其他 I/O设备)之间的数据交换的速度而设计的。
Cache高速缓存 :cache是高速缓存,用于cpu与内存之间的缓冲。主要原因是cpu与 memory,由于cpu快,memory跟不上,且有些值使用次数多,所以放入cache中,主要目的是,使用内存来缓存可能被再次访问的数据。 Cache 经常被使用在I/O 请求上。为提高系统性能。
server_tokens off;
隐藏nginx 的版本号;
include vhosts.conf;
incline 包含的其他的配置文件,比如自定义虚拟主机;
server {
listen 80; 0.0.0.0:8080    #侦听80端口
server_name www.jfedu.net;    #定义使用www.wzstyle.cn(域名)访问
access_log logs/access.log main;     #设定本虚拟主机的访问日志
root /data/webapps/www;  #定义服务器的默认网站根目录位置
index index.php index.html index.htm test.html; #定义首页索引文件的名称
#以下是一些反向代理的配置.
proxy_next_upstream http_502 http_504 error timeout invalid_header;
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host=$host;    #设定代理转发主机头(url)
proxy_set_header X-Real-IP=$remote_addr;   #设置转发代理的IP地址
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;  
#转发多层代理ip地址,格式如下:client 、proxy1、proxy2
proxy_pass http://wzstyle.cn; #请求转向后端定义的均衡模块
}
}
nginx之配置proxy_set_header 演示
win10客户端请求web服务,win10的ip:10.0.0.1
nginx作为反向代理服务器:10.0.0.6
nginx作为后端web服务器:10.0.0.7
配置nginx 转发到后端服务器上
1、proxy_set_header Host $host;参数测试
配置nginx 10.0.0.6代理端
增加一下配置…
location / {
root html;
index index.html index.htm;
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://10.0.0.7:8080;
}
配置nginx 10.0.0.7后端日志
开启了10.0.0.7日志,设定$host 主机头(url)
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” $host ”$status $body_bytes_sent “$http_referer” ””$http_user_agent” “$http_x_forwarded_for”‘;
查看日志,分析主机名
10.0.0.6 – – [20/May/2019:22:25:44 +0800] “GET / HTTP/1.0″www.wzstyle.cn 304 0 “-” “Mozilla/5.0(Windows NT 10.0; Win64; x64; rv:66.0)Gecko/20100101 Firefox/66.0” “10.0.0.1
#如果后端10.0.0.7 没有设定主机头,没有收到域名,对于某些网站来说,容易出现页面参数或者是图片丢失的问题。即验证了proxy_set_header Host $host; $host就是nginx代理服务器,也就是win10客户端请求的host
2.proxy_set_header X-Real-IP $remote_addr;
将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
nginx转发6服务器日志格式为:
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” $http_host ”$status $body_bytes_sent “$http_referer” ””$http_user_agent” “$http_x_forwarded_for”‘;
nginx后端7服务器的日志格式:
log_format main ‘$remote_addr “$http_x_real_ip” – $remote_user [$time_local] “$request””$http_host” ”$status $body_bytes_sent “$http_referer” ””$http_user_agent” “$http_x_forwarded_for”‘;
两者区别在于”$http_x_real_ip”,添加了这个变量的值,可以显示客户端的真实ip。
3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。
这一HTTP头一般格式如下:
X-Forwarded-For: client1, proxy1, proxy2
其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发,直到到达请求终点。

鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。


nginx 优化配置文件完整版(根据自己机器情况修改)
user nginx;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
worker_rlimit_nofile 102400;

events {
worker_connections 65535;
multi_accept on;
use epoll;
}

http {
include mime.types;
default_type application/octet-stream;
charset UTF-8;
sendfile on;
tcp_nopush on;
access_log off;
error_log /var/log/nginx/error.log crit;
keepalive_timeout 10;
tcp_nodelay on;
client_header_timeout 10;
client_header_buffer_size 4k;
client_body_timeout 10;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
reset_timedout_connection on;
send_timeout 10;
server_tokens off;
client_max_body_size 10m;
client_body_buffer_size 128k;
gzip on;
gzip_proxied any;
gzip_min_length 1000;
gzip_buffers 4 16k;
gzip_vary on;
gzip_http_version 1.1;
gzip_comp_level 4;
gzip_types text/plain text/css text/javascript application/json application/javascript
application/x-javascriptapplication/xml;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
large_client_header_buffers 4 4k;
fastcgi_cache_path /usr/local/nginx/php_cache levels=1:2 keys_zone=cache_php:30m inactive=1d max_size=10G;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
fastcgi_intercept_errors on;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status
$body_bytes_sent "$http_referer" ' '"$http_user_agent" $request_time';

upstream jvm_web1 {
server 10.0.0.4:8080 weight=1 max_fails=2 fail_timeout=30s;
server 10.0.0.4:8081 weight=1 max_fails=2 fail_timeout=30s;
}

server {
listen 80;
server_name  ip wzstyle.cn www.wzstyle.cn;
location /
{
index index.php index.html index.avi;
root /usr/local/nginx/html;
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_web1;
}

location ~ \.(php)$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
include fastcgi_params;
fastcgi_cache php_cache;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key $host$request_uri;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /usr/local/nginx/html/static/image/common;
valid_referers wzstyle.cn www.wzstyle.cn;
if ($invalid_referer) {
return 403;
}
}
}

原创文章,作者:wz,如若转载,请注明出处:https://www.wzstyle.cn/444.html

发表评论

邮箱地址不会被公开。 必填项已用*标注