一、Nginx 配置


一、Nginx 配置

# nginx.conf 配置文件
# nginx.conf.default 配置文件备份

# 配置文件的语法格式
'语句块' '参数' { 
	'属性' '属性值;' 
}
# 启动工作进程的用户和用户组
#user  nobody;
user  root;


# 工作进程的数目。建议根据硬件配置(一般为 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 工作进程的最大连接数(最大连接数 = 连接数 * 进程数)
    # 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; 
	
	# 目录列表访问(默认off)
	autoindex on; # 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;
	# 设置 gzip 压缩比(取值范围是1 - 9)
	# 1最低的压缩级别(缩速度最快,但压缩率相对较低)
	# 9最高的压缩级别(实现最大程度的压缩,使文件变得最小,但压缩速度最慢)
	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 {
    # 监听的端口(默认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默认端口443)
	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 过滤器模块

# 配置顺序。从上到下依次进行匹配

# location 语法。优先级顺序(=、^~、无修饰符、~*、~)
location [=|~|~*|^~] uri {
	... 
}

# 1. 精确匹配(=)
# 当请求的 URI 完全等于/index.html时,会返回状态码为 200,并显示This is the index page。
# 这种匹配方式是最严格的,只有请求的 URI 与指定的完全一致才会匹配。
location = /index.html { 
	return 200 'This is the index page'; 
}

# 2. 前缀匹配(^~)
# 当请求的 URI 以/admin/开头时,会优先使用这个规则进行匹配,并且不会再检查正则表达式的匹配规则。
# 这里还设置了基本的 HTTP 认证,用于限制对/admin/路径下资源的访问,只有提供正确的用户名和密码(存储在/etc/nginx/.htpasswd文件中)才能访问。
location ^~ /admin/ { 
	auth_basic "Restricted"; 
	auth_basic_user_file /etc/nginx/.htpasswd; 
}

# 3. 前缀匹配(无修饰符)
# 当请求的 URI 以/images/开头时,会在服务器的/var/www/images/目录下寻找对应的文件来处理请求。
# 例如,请求/images/logo.png,Nginx 会在/var/www/images/logo.png寻找该文件。
# 这是最常用的匹配方式之一,用于处理以某个路径开头的一系列请求。
location /images/ { 
	root /var/www; 
}

# 4. 区分大小写的正则表达式匹配(~)
# 当请求的 URI 以.php结尾时(这里使用了正则表达式\.php$),会将请求通过 FastCGI 协议转发给 PHP - FPM 处理。
# 注意,这个正则表达式是区分大小写的,所以/test.PHP不会匹配这个规则。
location ~ \.php$ { 
	fastcgi_pass unix:/var/run/php - fpm.sock; 
	fastcgi_index index.php; 
	include fastcgi_params; 
}

# 5. 不区分大小写的正则表达式匹配(~*)
# 当请求的 URI 以.jpg、.jpeg、.png或.gif结尾时(不区分大小写),会设置expires头为 30 天。
# 这对于设置图片等静态资源的缓存有效期很有用,例如请求/image/TEST.JPG也会匹配这个规则并设置缓存时间。
location ~* \.(jpg|jpeg|png|gif)$ { 
	expires 30d; 
}

# location 嵌套使用
# 当请求的URI以`/api/`开头时,会进入外层的`location`块。
# 然后如果请求的URI还以`.json`结尾,会进入内层的`location`块。
# 添加`Content - Type`头为`application/json`。这样可以对`/api/`路径下的`.json`文件进行特殊的处理。
location /api/ {
    location ~ \.json$ {
        add_header Content - Type application/json;
    }
}
# 过滤器模块(路由/匹配所有的请求)
location / {
    # 站点根路径,当前 localhost 享有(配置绝对路径)
    # localhost.root 优先级高于 server.root
    root   html;
    # 站点页面
    index  index.html index.htm;
	
	# 配置请求头
	#proxy_set_header Host $host;
	# 配置代理
	#proxy_pass https://www.qs.com:443/;
}
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;
}

$ curl http://127.0.0.1/qs/index.html
# /www/qshome/qs/index.html
2. alias 站点别名
# 指定站点别名
`
alias <目录>
`
1. 只能配置 location 模块中
2. 基于 alias + (URI  - location) 路径,去寻找文件
location /qs {
	alias  /www/qshome;
	index  index.html index.htm;
}

$ curl http://127.0.0.1/qs/index.html
# /www/qshome/index.html
location /tools/ {
	alias /root/tools/;
	autoindex on;
	allow all;
}
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;
	# 超过30m之后再限速
	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 自上次启动以来的工作状态,此模块非核心模块
# StubStatus 模块需要在 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;
}
12. try_files 解决刷新 url 重定向问题
# try_files指令:试文件
1. 对于location /qs/,当请求一个文件(如/qs/some_file)不存在时。
2. /try_files会先尝试查找$uri(即/qs/some_file)。
3. 然后是$uri/(即/qs/some_file/)。
4. 如果都找不到,就会返回/qs/index.html。
location /qs/ { # 前端项目qs
	root	/usr/share/nginx/html/;
    index	index.html index.htm;
    # 不存在就重定向/qs/index.html,而不是/index.html
    try_files $uri $uri/ /qs/index.html;
}

location / { # 前端项目qshome
    root   /usr/share/nginx/html/qshome/;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
}

二、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 扩展

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

骑士梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值