# 1. Nginx

# 1.1. 日志变量

$remote_addr$http_x_forwarded_for  # 用以记录客户端的ip地址; 

$remote_user # 用来记录客户端用户名称; 

$time_local # 用来记录访问时间与时区;

$request # 用来记录请求的url与http协议;

$status # 用来记录请求状态;成功是200, 

$body_bytes_sent # 记录发送给客户端文件主体内容大小;

$http_referer # 用来记录从那个页面链接访问过来的; 

$http_user_agent # 记录客户端浏览器的相关信息;

# 1.2. 全局变量

worker_processes auto; # nginx开启的进程数

pid /run/nginx.pid; # 指定进程ID存储文件位置

# 1.3. 事件配置events

use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];

epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。

use epoll;

worker_connections 1024;  #最大连接数,默认为512
  • 开启高效传输模式。
sendfile on;
  • 防止网络阻塞
tcp_nopush on;

tcp_nodelay on; 
  • 客户端连接超时时间,单位是秒
keepalive_timeout 60;
  • 客户端请求头读取超时时间
client_header_timeout 10;
  • 设置客户端请求主体读取超时时间
client_body_timeout 10;
  • 响应客户端超时时间
send_timeout 10;

# 1.4. proxy_buffering

proxy_buffering主要是实现被代理服务器的数据和客户端的请求异步。

为了方便理解,我们定义三个角色,A为客户端,B为代理服务器,C为被代理服务器。

  • proxy_buffering开启,A发起请求到B,B再到C,C反馈的数据先到B的buffer上,然后B会根据proxy_busy_buffer_size来决定什么时候开始把数据传输给A。
  • 在此过程中,如果所有的buffer被写满,数据将会写入到temp_file中。
  • 相反,如果proxy_buffering关闭,C反馈的数据实时地通过B传输给A。

# 1.5. Nginx 代理

  • nodenginx配置的时候,不能在根目录/下配置代理,那是react或者vue放的真实的地址。
  • 而应该再添加一个location,代理/api,这也是为什么很多项目代码里请求地址前面都是/api开头。

# 1.6. 配置https以及http自动跳转到https

https配置

# 1.6.1. 常见规则

  • http:协议级别
  • server:服务器级别
  • location:请求级别
location [=|~|~*|^~] /uri/ { … }

=表示:必须与指定的模式精确匹配

server {
server_name sish
   location = /abc {
   }
}

那么,如下是对的:

`http://baidu.com/abc`
`http://baidu.com/abc?p1`

如下是错的:

`http://baidu.com/abc/`
`http://baidu.com/abcde`

~ 表示:指定的正则表达式要区分大小写

server {
server_name baidu.com;
   location ~ ^/abc$ {
   }
}

那么,如下是对的:

http://baidu.com/abc
http://baidu.com/abc?p1=11&p2=22

如下是错的:

http://baidu.com/ABC
http://baidu.com/abc/
http://baidu.com/abcde

~* 表示:指定的正则表达式不区分大小写

server {
server_name baidu.com;
location ~* ^/abc$ {
   }
}

那么,如下是对的:

http://baidu.com/abc
http://baidu..com/ABC
http://baidu..com/abc?p1=11&p2=22

如下是错的:

http://baidu..com/abc/
http://baidu..com/abcde