一、Nginx 配置


一、Nginx 配置

  • nginx.conf:配置文件
  • nginx.conf.default:配置文件备份
# 配置文件的语法格式
'语句块' '参数' { 
	'属性' '属性值;' 
}

# worker(工作进程)指定启动用户 和 用户组
#user  nobody;
user  root;


# nginx worker(工作进程)数目
# 建议根据硬件配置(一般和 CPU 数量一致,或者 CPU 数量的 2 倍,能达到最佳性能)
worker_processes  1;


# 全局错误日志文件,以及日志级别
# 日志级别 由 日志最多到最少: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;


# 一个 nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数
# 1. 系统的值 ulimit -n,与 nginx 进程数相除
# 2. 但是 nginx 分配请求并不均匀,所以建议与 ulimit -n 的值保持一致
worker_rlimit_nofile 65535;


# 工作模式 与 连接数上限
events {
	# 参考事件模型,use[kqueue|rtsig|epoll|/dev/poll|select|poll]; 
	# epoll 模型是 Linux 2.6 以上版本内核中的高性能网络I/O模型,如果跑在 FreeBSD 上面,就用 kqueue 模型
	use epoll;
    # 单个 nginx worker(工作进程)的最大连接数(最大连接数 = 连接数 * 进程数)
    # nginx 支持的总连接数 = worker_connections * worker_processes
    worker_connections  1024;
}


# http 服务器模块
#http { ... }

1. http 服务器模块

http {
	# nginx 支持哪些多媒体类型(文件扩展名 与 文件类型映射表)
	include       mime.types;
	
	# 默认文件类型
	default_type  application/octet-stream;
	
	# 默认编码
	charset utf-8;

	# 服务器名字的 hash 表大小(服务器域名的散列表大小)
	server_names_hash_bucket_size 128;
	server_names_hash_max_size 2048;
	
	# 上传文件大小限制
	client_header_buffer_size 32k;
	# 设定请求缓
	large_client_header_buffers 4 64k;
	# 设定请求缓
	client_max_body_size 8m; 
	
	# 开启目录列表访问,合适下载服务器(默认关闭)
	autoindex on; # 显示目录
	# 显示文件大小(默认为on)显示出文件的确切大小(单位是bytes)
	# 改为 off 后,显示出文件的大概大小,单位是 kB、MB 或 GB
	autoindex_exact_size on;
	# 显示文件时间(默认为off)显示的文件时间为 GMT 时间
	# 改为 on 后,显示的文件时间为文件的服务器时间
	autoindex_localtime on; 
	
	# 日志格式
	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;
	
	
	# 开启 gzip 压缩输出
	gzip  	    	   on;
	# 允许压缩的页面的最小字节数,页面字节数从 header 头的 content-length 中获取
	# 默认是0,不管页面多大都进行压缩
	# 建议设置成大于 1k 的字节数,小于 1k 可能会越压越大
	gzip_min_length 1k; 
	# 表示申请 4 个单位为 16k 的内存作为压缩结果流缓存
	# 默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果
	gzip_buffers 4 16k; 
	# 压缩版本(默认 1.1,目前大部分浏览器已经支持 gzip 解压,前端如果是 squid2.5 请使用 1.0)
	gzip_http_version 1.1; 
	# 压缩等级.1 压缩比最小
	# 处理速度快.9 压缩比最大,比较消耗 cpu 资源,处理速度最慢
	# 但是因为压缩比最大,所以包最小,传输速度快
	gzip_comp_level 2; 
	# 压缩类型(默认就已经包含text/html)所以下面就不用再写了,写上去也不会有问题,但是会有一个 warn
	gzip_types text/plain application/x-javascript text/css application/xml;
	# 选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面
	# 例如:用 squid 缓存经过 nginx 压缩的数据
	gzip_vary on;
	
	# 开启高效文件传输模式
	# sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用设为 on
	# 如果用来进行下载等应用磁盘 IO 重负载应用,可设置为off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载
	# 注意:如果图片显示不正常把这个改成 off
	sendfile    	   on;
	
	# 开启 防止网络阻塞 模式(减少网络报文段数量)
	tcp_nopush  	   on;
	# 防止网络阻塞(提高 I/O 性能)
	tcp_nodelay 	   on; 
	
	# 超时闲置时间,长连接超时时间(单位秒,默认 65 秒)自动断开
	# 在超过这个时间后服务器会关闭该链接
	#keepalive_timeout  0;
	keepalive_timeout  65;
	
	# 读取客户端请求头数据的超时时间(默认秒,默认 60 秒)
    client_header_timeout 15;
    
    # 读取客户端请求主体的超时时间(默认秒,默认 60 秒)
    client_body_timeout 15;
    
    # 响应客户端的超时时间(默认秒,默认 60 秒)
    send_timeout 25;
 
    # 上传文件的大小限制(默认 1m)
    client_max_body_size 8m;
	
	
	# FastCGI 相关参数是为了改善网站的性能:减少资源占用、提高访问速度,下面参数看字面意思都能理解
	fastcgi_connect_timeout 300;
	fastcgi_send_timeout 300;
	fastcgi_read_timeout 300;
	fastcgi_buffer_size 64k;
	fastcgi_buffers 4 64k;
	fastcgi_busy_buffers_size 128k;
	fastcgi_temp_file_write_size 128k;
	
	
	# 开启限制 IP 连接数的时候需要使用
	#limit_zone crawler $binary_remote_addr 10m;


	# upstream 的负载均衡(四种调度算法)
	
	# 站点模块(虚拟主机,可配置一个或多个)
	# server { ... }
}

1. client_max_body_size 请求体大小
  • 上传文件大小的限制
  • 限制请求体的大小,若超过所设定的大小,返回 413 错误
  • 默认1m(位置 http、server、location)

2. client_header_timeout 读取请求头超时
  • 读取请求头的超时时间,若超过所设定的大小,返回 408 错误

3. client_body_timeout 读取请求体超时
  • 读取请求实体的超时时间,若超过所设定的大小,返回 413 错误

4. proxy_connect_timeout 代理连接超时
  • http 请求无法立即被容器(tomcat、netty 等)处理,被放在 nginx 的待处理池中等待被处理
  • 此参数为等待的最长时间,默认为 60 秒,官方推荐最长不要超过 75 秒

5. proxy_read_timeout 代理读取超时
  • http 请求被容器(tomcat、netty 等)处理后,nginx 会等待处理结果,也就是容器返回的 response
  • 此参数即为服务器响应时间,默认 60 秒

6. proxy_send_timeout 代理发送超时
  • http 请求被服务器处理完后,把数据传返回给 nginx 的用时
  • 默认 60 秒

2. server 站点模块

  • server { … }:具体的站点(可配置一个或多个)
  1. listen 端口:监听的端口(默认:80)
  2. server_name 服务名:主机名称,外网访问的域名(默认:“”,多个空格隔开,支持通配符 *.qs.com www.qs.* 与正则)
  3. root 目录:站点根路径,站点内所有 localhost 共享(配置绝对路径)
# 站点模块,虚拟主机
server {
    # 监听的端口(默认:80)
    #listen       80 default;
    listen       80;
    
	
	# 主机名称,外网访问的域名
	# 默认:"",多个空格隔开,支持通配符`*.qs.com www.qs.*`与正则
    server_name  localhost;


	# http 自动跳转 https
	rewrite ^(.*) https://$server_name$1 permanent;
    
    
    # 字符集
    charset utf-8;

	
    # 访问日志
    access_log  logs/host.access.log  main;

	
    # 站点根路径,站点内所有 localhost 共享(配置绝对路径)
	root /usr/www/qs/;
	# 站点页面
	index index.html;
	
	
    # 过滤器模块(`/`匹配所有的请求)路由
    location / {
        # 站点根路径,当前 localhost 享有(配置绝对路径)
        root   html;
        # 站点页面
        index  index.html index.htm;
    }


    # 404页面
    error_page  404              /404.html;
    # 将服务器错误,重定向到静态页面 50x.html
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

	
	# 引入其他的配置文件(servers目录下)
    include servers/*;
}
server {
	# 监听端口 https
	listen 443 ssl;
	server_name ably.com;

	# 配置域名证书
	ssl_certificate C:\WebServer\Certs\certificate.crt;
	ssl_certificate_key C:\WebServer\Certs\private.key;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 5m;
	ssl_protocols SSLv2 SSLv3 TLSv1;
	ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
	ssl_prefer_server_ciphers on;
	
	index index.html index.htm index.php;
	root /data/www/;
	location ~ .*\.(php|php5)?$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		include fastcgi.conf;
	}
}

1. 指定定错误页面
# 根据状态码,返回对于的错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /source/error_page;
}
2. 静态文件压缩
server {
    # 开启 gzip 压缩
    gzip on;
    # 设置 gzip 所需的 http 协议最低版本(HTTP/1.1, HTTP/1.0)
    gzip_http_version 1.1;
    # 设置压缩级别,压缩级别越高压缩时间越长(1-9)
    gzip_comp_level 4;
    # 设置压缩的最小字节数,页面 Content-Length 获取
    gzip_min_length 1000;
    # 设置压缩文件的类型(text/html)
    gzip_types text/plain application/javascript text/css;
}

3. 动静分离
  • 基于目录 动静分离
server {
	listen 80;
	server_name *.qs.com;
	root /www/qshome;
	
	location / {
		index qs.html;
	}
	
	# 配置 /static
	location /static {
		alias /www/qshome/static;
	}
}


  • 基于正则 动静分离
server {
	listen 80;
	server_name *.qs.com;
	root /www/qshome;
	
	location / {
		index qs.html;
	}
	
	# 配置`~* \.(gif|jpg|png|css|js)$`
	location ~* \.(gif|jpg|png|css|js)$ {
		root /www/qshome/static;
	}
}


4. 子域名站点
  • 每个子域名对应一个静态站点,如果每天增加一个域名会相当麻烦。
  • 在 Nginx 当中可直接基于 $host 连接到对应目录。
server {
	listen 80;
	server_name *.qs.com;
	root /data/www/$host;
	access_log logs/$host.access.log;
	
	location / {
		index index.html;
	}
}

3. location 过滤器模块

  • localhost { … }:过滤器模块(/ 匹配所有的请求)
  1. root 目录:localhost.root 优先级高于 server.root
  2. index index.html:站点页面
  3. proxy_set_header:请求头
  4. proxy_pass:代理

  • location 语法:location [=|~|~*|^~|@]/URI/ { ... }
  1. =:表示把 URI 作为字符串,与参数中的 URI 做 完全匹配
  2. ~:表示正则匹配 URI 时,字母大小写是敏感的
  3. ~*:表示正则匹配 URI 时,忽略字母大小写
  4. ^~:表示正则匹配 URI 时,只需要其前半部分与 URI 参数匹配即可
  5. /:表示基于 URI 目录匹配
  • 匹配优先规则:= > ^~ > ~* > ~

location ~ \.php$ {
    proxy_pass   http://127.0.0.1;
}
location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    include        fastcgi_params;
}
location ~ /\.ht {
    deny  all;
}

1. root 站点根目录
  • root 目录:指定站点根目录
  1. 可配置在 server.root 或 location.root 模块中
  2. 基于路径 root + URI,去寻找指定文件

location /qs {
	root   /www/qshome/;
	index  index.html index.htm;
}


2. alias 站点别名
  • alias 目录:指定站点别名
  1. 只能配置 location 模块中
  2. 基于 alias + (URI - location) 路径,去寻找文件

location /qs {
	alias  /www/qshome;
	index  index.html index.htm;
}


3. 根据 文件类型 设置 过期时间
location ~.*\.css$ {
    expires 1d;
    break;
}
location ~.*\.js$ {
    expires 1d;
    break;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    access_log off;
    expires 15d; # 保存 15 天
    break;
}

# 测试图片的 max-age
#curl -x127.0.0.1:80 http://www.test.com/static/image/common/logo.png -I
# 图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
	expires 10d;
}
# JS 和 CSS 缓存时间设置
location ~ .*\.(js|css)?$ {
	expires 1h;
}

4. 禁止文件缓存
  • 开发环境经常改动代码,由于浏览器缓存需要强制刷新才能看到效果
  • 可以禁止浏览器缓存提高效率
location ~* \.(js|css|png|jpg|gif)$ {
	add_header Cache-Control no-store;
}

5. 防盗链
  • 指本站内 图片、CSS 等资源,只有本站点可以访问,不允许其它站点打开
  • 该功能如果用 Java 实现很单简单,只要判断一下请求头当中的 referer 属性是否为指定域名即可
  • 说明:如果 valid_referers 条件判断未通过,nginx 则会赋值 invalid_referer 为 true

  • 语法:valid_referers none | blocked | server_names | string ...;
  1. none:不允许 Referer 来源 头部为空的情况
  2. blocked:不允许 Referer 值为空的情况(有可能 Referer 的值,被 代理 或者 防火墙 删除)
  3. server_names:Referer 来源头部包,必须含当前的 server_names 中一个(当前域名,可以配置多个)
  4. string:自定义字符串,可以在 开头 或 结尾 有 "*"(检查时,“Referer” 字段中的 服务器端口 被忽略)

location ~* \.(gif|png|jpg|swf|flv)$ {
	root html;
	# 只允许 www.qs.com、www.qshome.com 请求资源
	valid_referers  www.qs.com www.qshome.com;
	if ($invalid_referer) {
		# 替换为防盗链图片
		rewrite ^/ http://www.qs.com/image/403.png;
	}
}
location ~* \.(gif|png|jpg|swf|flv)$ {
	root html;
	# 只允许 *.qs.com、*.qshome.com 请求资源
	valid_referers  none blocked *.qs.com *.qshome.com;
	if ($invalid_referer) {
		return 403;
	}
}
location ~* \.(gif|jpg|png)$ {
    # 只允许 192.168.0.1 请求资源
   	valid_referers none blocked 192.168.0.1;
    if ($invalid_referer) {
       rewrite ^/ http://$host/logo.png;
    }
}

6. 下载限速
location /download {
	# 限制每秒下载速度
	limit_rate 1m;
	
	# 超过`30`兆之后再限速
	limit_rate_after 30m;
}

7. IP 黑名单
# 拒绝访问
location ~ /\.ht {
    deny  all;
}

# 封禁指定`IP`
deny 192.168.0.1;
# 开放指定`IP`
allow 192.168.0.2;

# 封禁指定`IP`段
deny 192.168.0.0/24;
# 开放指定`IP`段
allow 192.168.0.25/30;

# 封禁所有
deny all;
# 开放所有
allow all;

# 创建黑名单文件
echo 'deny 192.168.0.132;' >> balck.ip

# `http`配置块中引入`balck.ip`黑名单文件
include black.ip;

8. nginx 状态
location /nginx_status {
	stub_status on;
	access_log   off;
}
# 设定查看 nginx 状态的地址
# StubStatus 模块能够获取 nginx 自上次启动以来的工作状态,此模块非核心模块
# 需要在 nginx 编译安装时手工指定才能使用
location /NginxStatus {
	stub_status on;
	access_log on;
	auth_basic "NginxStatus";
	auth_basic_user_file conf/htpasswd;
	# htpasswd 文件的内容可以用 apache 提供的 htpasswd 工具来产生
}

9. stub_status
location = /basic_status {
    stub_status;
}

10. 请求头
location = / {
	proxy_set_header  LoginFrom 	   'Internet';
}

11. 配置地址拦截转发,解决跨域验证问题
location /oauth/{
	proxy_pass https://localhost:13580/oauth/;
	proxy_set_header HOST $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

二、Nginx 其他配置


1. 日志配置

# 日志格式
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;
# $remote_addr 远程地址(192.168.31.52)
# $remote_user 远程用户
# $time_local 本地时间(26/Aug/2022:18:40:46 +0800)
# $request 请求(GET /api/captchaImage HTTP/1.1)
# $request_body
# $request_length
# $request_filename
# $request_time
# $status 状态(200、404)
# $upstream_status
# $upstream_response_time
# $upstream_connect_time
# $upstream_header_time
# $bytes_sent
# $body_bytes_sent 发送体字节(197)
# $http_referer
# $http_user_agent HTTP用户代理
# http_x_forwarded_for HTTP转发给x("http://127.0.0.1/login?redirect=%2Findex")
# $http_cookie
# $document_root
# $fastcgi_script_name
log_format log_json '{"本地时间": "$time_local", '
                        '"请求地址": "$remote_addr", '
						'"请求服务": "$request", '
                        '"请求状态": $status, '
                        '"字节大小": $body_bytes_sent, '
                        '"用户访问地址": "$upstream_addr",'
                        '"域名": "$upstream_http_host",'
                        '"响应时间": "$upstream_response_time",'
                        '"请求时间": "$request_time"'
                        ' }';

1. 基于域名打印日志
# 基于域名打印日志
access_log  logs/$host.access.log  main;

2. error 日志配置
  • 语法:error_log '/path/file' 'level';
  1. /path/file:日志路径
  2. level:日志的输出级别(取值范围是:debug > info > notice > warn > error > crit > alert > emerg)
  • 默认:error_log logs/error.log error;

3. 指定客户端输出 debug 日志
  • 语法:debug_connection [ IP | CIDR ];
  • 注意:debug 日志的开启,必须在安装时添加 --with-debug(允许 debug)
events {
	debug_connection 192.168.0.147; 
	debug_connection 10.224.57.0/200;
}

2. 上传文件大小

  • 上传文件报 413 Request Entity Too Large
  1. 设置到 http{} 内,控制全局 nginx 所有请求报文大小
http {
	client_max_body_size 20M
}
  1. 设置到 server{} 内,控制该 server 的所有请求报文大小
server {
	client_max_body_size 20M
}
  1. 设置到 location{} 内,控制满足该路由规则的请求报文大小
localhost / {
	client_max_body_size 20M
}

三、Nginx 扩展


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑士梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值