**nginx.conf配置文键** # `主要分为` 全局模块、events模块、http模块、server模块、location模块、 # `这些模块的命令`,有些是自己的独有的,有些是可以在其子模块中使用的。 # `模块命令的优先级`,最近原则,子模块中有定义就用子模块,没有找到就去父模块中找。 **各模块所在位置和含义** # `全局模块` :从配置文件开始到 events之间。主要设置影响服务器整体运行的配置指令,指令作用域去全局的 # `events模块`:全局模块中,指令主要影响nginx服务器和用户的网路连接。 # `http模块`:全局模块中,nginx的代理、缓存和日志等绝大数的功能和第三方模块配置都放在这个模块。 # `server模块`:在http模块中,配置'虚拟主机'相当于,可以有多个server模块,各模块互不影响。 # `location模块`:server模块中,严格意义来说是server模块的一条指令,匹配请求过来的路由,可以配置多个location模块。 ##配置运行nginx服务器用户(组)。 user nginx [group]; `user`是指令,`nginx`是用户,`group`使用户组, *允许所有人访问*1、直接注释该命令,2、设置user nobody nobody ## 配置允许生成的worker process数 #worker_processes number | auto; `number` 具体的数组nginx进程数。`auto`系统自动配置进程数。 worker_processes auto; #错误日志的存放路径, #错误级别[debug|info|notice|warn|error|crit|alert|emerg] #由低到高,默认是error,会记录更高级别的错误。 error_log /var/log/nginx/error.log; #配置nginx进程pid存放路径,保存的是当前运行程序的主进程号。 pid /run/nginx.pid; # 加载动态模块. See /usr/share/doc/nginx/README.dynamic. #该命令需要用户对该目录有写的权限,该指令可以写在任意地方。 include /usr/share/nginx/modules/*.conf; *events模块* events { #配置worker process同时开启最大链接数,需要开启 multi_accept 配置。 worker_connections 1024; #网络连接序列化,防止多个进程对连接的争抢。`no`开启,默认选项,`off`关闭 *惊群*:当你有多个进程处于等待连接的时候,突然来了一个连接,这些进程都被唤醒,然后争抢这个连接,导致不必要的开销。 #accept_mutex就是来解决争抢问题的,通过判断锁的状态来选择一个进程来处理该连接,这样就没有争抢了。 `问题`:当网站访问量很高,有多个连接过来时候,在一个一个去分配进程就会很慢,不如让进程过来抢连接。 `总结`:当网站流量小的时候,开启网络链接序列化,当网站流量大的时候关闭网络链接序列化。 accept_mutex on; #是否允许一个进程同时接收多个网路连接 #默认关闭,开启为on, multi_accept off; #事件驱动模式 #允许的选择 [select|poll|kqueue|epoll|rtsig|/dev/poll|eventport] use poll } http { *定义请求日志模板* log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; *例子:58.247.212.239 - - [23/May/2020:12:59:11 +0800] "GET http://212.64.**.**/laravel.php HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0" "-"* `$remote_addr`:用户机器的ip地址 58.247.212.239 `$remote_user`:记录客户端用户名称 为空 `$time_local`:获取本地时间,也就是请的时间点。 [23/May/2020:12:59:11 +0800] `$request`:用户的请求方式+请求路径+协议。 "GET http://212.64.**.**/laravel.php HTTP/1.1" `$status`:请求状态码,[200|404|500]等 404 `$body_bytes_sent`:获取请求体的大小。 153 `$http_referer`:从哪个页面跳转过来的。 为空 有可能是直接访问的路径 `$http_user_agent`:获取用户使用的浏览器。 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0" `$http_x_forwarded_for`:用户机器的ip地址。 为空 *请求日志* `main`:日志记录的模板格式名称。 access_log /var/log/nginx/access.log main; `是否允许sendfile方式传输文件` #参考:http://xiaorui.cc/archives/1673 *理解:*简单说,sendfile是个比 read 和 write 更高性能的系统接口, 不过需要注意的是,sendfile 是将 in_fd 的内容发送到 out_fd 。而 in_fd 不能是 socket , 也就是只能文件句柄。 所以当 Nginx 是一个静态文件服务器的时候, 开启 SENDFILE 配置项能大大提高 Nginx 的性能。 但是当 Nginx 是作为一个反向代理来使用的时候, SENDFILE 则没什么用了,因为 Nginx 是反向代理的时候。 in_fd 就不是文件句柄而是 socket, 此时就不符合 sendfile 函数的参数要求了。 sendfile on; `允许sendfile()传输的数据量最大值` 这两条命令允许,写在:http块、server块、location块中。 sendfile_max_chunk 128k; tcp_nopush on; tcp_nodelay on; `链接超时时间限制` 可以设置第二个参数100 实际是在65s就结束该连接,但是返回给用户报文中Keep-alive域的超时时间设置为100s。 keepalive_timeout 65s 100s; `单连接请求上限` 一个链接最多可以发送多少个请求。默认是100个。可以写在,http模块、server模块、location模块中 keepalive_requests 100; types_hash_max_size 2048; #定义MIME-Type,换言之,MIME-type是网络资源的媒体类型, #nginx服务器作为web服务,必须能识别前端请求的资源类型。 include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; `server模块` server { `监听网络请求的ip和端口` listen 80 default_server; `监听所有的80端口,设置该虚拟主机为ip:port的默认主机` listen [::]:80 default_server; `监听的是ipv6的地址+80端口,设置该虚拟主机为ip:port的默认主机` server_name *.nginx.com ~^www\.\d+\.c*; `设置虚拟主机的名称 `可以是一个名称也可以是多个空格隔开。 可以使ip可以是域名,允许用正则。`~`表示正则匹配标记。 root /var/www/html;`配置请求的根目录` 可以在http块、server块、located块下配置。 include /etc/nginx/default.d/*.conf; `引入配置文件` `location块` location [ = | ~ | ~* |^~ ]/uri { #其中uri是待匹配的请求字符串,也就是请求路由。如/index.php # = 代表标准匹配(不含有正则) # ~ 代表正则匹配(含有正则,区分大小写) # ~* 代表正则匹配(含有正则,不区分大小写) # ^~ 代表标准匹配,先进行前缀匹配,匹配到后就不再匹配之后的。 #参考:https://www.ctolib.com/topics-129994.html ` ` `更改location中的uri`相当于重定到向另外的目录/ alias /var/www/html/wxgzh/public/ 比如说匹配了/index.php然后到alias指定目录去寻找index.php ` ` `deny address|CIDR|all`*拒绝链接。* `address`某个具体的ip `CIDR`客户端的CIDR地`all`所有链接 deny 192.168.1.1 #拒接 182.168.1.1的链接请求 `allow` *允许的链接* allow 192.168.1.0 #允许 182.168.1.1 的链接 deny all #拒绝所有链接 `你看这里先拒绝*.1.1的链接,在允许*.1.0的链接,在拒接所有的链接。那*.1.0的链接允许吗?允许的。 因为当遇到匹配的值后就不会再往下匹配了。` } location ~ \.php$ {#匹配以.php结尾的路由 `这些是吧接受到的请求交给 php-fmp来处理。要不就会进行下载` fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } ` ` *错误页面* `error_page`设置错误页面的指令。 `400`状态码。 `=403`实际返回给客户端的状态码。`/404.html`错误页面路由 error_page 404 =403 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }