nginx详解

概述

简介

Nginx是一款轻量级的Web服务器、反向代理服务器,专为性能优化而开发,使用异步非阻塞事件驱动模型

优点

1.开源软件,可以免费试用,并且可用于商业用途

2.内存消耗少,节省带宽,支持gzip压缩

3.可以高并发连接,官方测试能够支撑5万并发连接,在实际生产环境中可以支撑2到4万并发连接

4.内置的健康检查功能:如果Nginx proxy后端的某台服务器宕机了,不会影响前端访问

5.稳定性高:用于反向代理(负载均衡),宕机的概率微乎其微

6.支持热部署,在不间断服务的情况下,对软件版本升级

应用场景

HTTP服务器:部署只有静态资源的网站,可以通过异步请求接受数据

反向代理:作为代理服务器,连接网络请求并转发给内部网络的服务器

负载均衡:分摊到多个服务器上

动静分离:根据一定规则把不变的资源和经常变的资源区分开来

nginx目录详解

conf 存放配置文件

html 存放页面文件

index.html:访问Nginx时的首页

50x.html:错误提示页面

logs 存放 日志文件

刚安装完Nginx,从未启动过的话logs目录下什么都没有,只有启动Nginx后,才会出现以下三个文件

access.log:记录正常访问的服务日志(配置在http块)

error.log:错误日志(三块都可配置)

Nginx.pid:Nginx进程id(配置在全局块)

sbin 命令目录

docker安装

创建conf的挂载目录

mkdir -p /opt/nginx/conf

访问:cat /opt/nginx/conf/nginx.conf

修改:vim /opt/nginx/conf/nginx.conf

创建 html 的挂载目录

docker volume create nginx8020

访问:cd /var/lib/docker/volumes/nginx8020/_data

拉取镜像

docker pull nginx

初始化挂载目录的配置文件

docker run --rm --name nginx-short -p 8020:80 -d nginx

docker cp nginx-short:/etc/nginx/nginx.conf /opt/nginx/conf

docker stop nginx-short

创建容器

docker run --rm -d -p 8020:80 --name nginx8020 -v nginx8020:/usr/share/nginx/html -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx

修改docker中nginx的配置文件

docker exec -it nginx8024 /bin/bash

cat /etc/nginx/conf.d/default.conf

配置项

任意模块

引入配置文件

1.引入的文件要求运行Nginx进程的用户对其具有写权限

2.引入的文件要符合Nginx配置文件规定的相关语法和结构

示例:

include /etc/nginx/conf.d

全局块

配置错误日志的存放路径【全局块、http块和 server 块】

1.存放路径要求运行Nginx进程的用户对其具有写权限

示例:

error_log logs/error.log;#配置错误日志的存放路径

配置进程 PID 存放路径

#配置进程PID存放路径

pid logs/nginx.pid;

配置用户或者用户组访问Nginx进程的权限

1.不写的话所有用户都可以启动Nginx进程

示例:

#所有用户都可以启动Nginx进程

user nobody nobody;

配置Nginx进程允许生成worker process数

1.理论来说Nginx进程允许生成worker_process的值越大,可以支持的并发处理也越多

示例:

#Nginx进程允许生成worker process数为1

worker_processes 1;

#Nginx进程允许生成worker process数为1,Nginx进程将自动检测

worker_process 1 | auto;

events块

设置允许每一个worker process同时开启的最大连接数

#允许每一个worker process同时开启的最大连接数为1024

worker_connections 1024;

配置事件驱动模型

1.作用:强制Nginx服务器选择哪种事件驱动模型进行消息处理

2.事件驱动模型参数详解:

select、poll属于标准事件模型

Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃

Epoll:使用于Linux内核2.6版本及以后的系统。

/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+

Eventport:使用于Solaris 10。为了防止出现内核崩溃的问题,有必要安装安全补丁

示例:

#使用epoll标准事件模型

use epoll;

http块

定义网络资源的媒体类型

default_type application/octet-stream;#定义网络资源的媒体类型为application/octet-stream

自定义服务日志

1.作用:记录Nginx服务器提供服务过程应答前端请求的日志,Nginx服务器支持对服务日志的格式、大小、输出等进行配置

示例:

#自定义服务日志

access_log logs/access.log main;

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 /var/log/nginx/access.log main;

配置HTTP 长连接 超时时间【server块、HTTP块、location块中】

#在服务器端保持连接的时间设置为65s

keepalive_timeout 65;

#在服务器端保持连接的时间设置为120s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100s

keepalive_timeout 120s 100s;

开启文件高效传输模式

1.可以结合tcp_nopush或tcp_nodelay进一步优化性能,但这两个参数只能选其一

示例:

#开启文件高效传输模式

sendfile on;

#当有数据时,先不着急发送,确保数据包已经装满数据,避免网络拥塞。

tcp_nodelay on;

#只在连接传输进入到keep-alive状态,在每次只发送很少字节的业务场景中,使用该功能可以避免等待时间过长。

tcp_nopush on;

配置 Gzip 压缩

1.作用:开启Gzip压缩功能,可以使网站的css、js、xml、html文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能

将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节约带宽,并提⾼响应⾄客户端的速度

示例:

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1;

gzip_comp_level 9;

gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;

gzip_disable "MSIE 1-6\.";

gzip_vary on;

server块

配置网络监听

1.注意:如果是IPv6的地址,需要使用中括号""括起来,比如\[fe80::1等。

示例:

#监听80端口上的所有IP连接

listen 80;

#监听192.168.1.10:8000上的连接

listen 192.168.1.10:8000;

#监听192.168.1.10所有端口上的连接

listen 192.168.1.10;

域名

1.作用:设置了虚拟主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟主机发送请求了

2.优先级:精确匹配>左侧通配>右侧通配>正则表达式匹配

示例:

server_name localhost;

server_name *.*;#匹配所有

server_name www.baidu.com;#精确匹配www.baidu.com

server_name *.baidu.com;#通配.baidu.com

server_name www.baidu.com *baidu.com;#精确匹配www.baidu.com,通配.baidu.com

实现域名跳转

#域名test.com直接跳转到域名jkw.life

rewrite ^/(.*) http://jkw.life/$1 permanent;

location块

location匹配规则

location / {...}#无限制匹配

location = /abc {...}#精确匹配,如http://baidu.com/abc?p1

location ~ ^/abc$ {...}#正则匹配,区分大小写,如http://baidu.com/abc正确,http://baidu.com/ABC错误

location ~* ^/abc$ {...}#正则匹配,不区分大小写,如http://baidu.com/abc http://baidu..com/ABC正确

location ^~ /images/ {...}#匹配到即停止搜索

配置文件资源根目录路径

1.作用:当location块接收到/index.html的请求时,将在/usr/share/nginx/html目录下找到index.html响应请求

2.root和alias指令有区别

示例:

#文件资源放在/usr/share/nginx/html中

location / {

root /usr/share/nginx/html;

}

#对应磁盘映射路径/opt/nginx/html/images/images/1.jpg

location / {

root /opt/nginx/html/images;

}

#最后面一定要加 "/",对应磁盘映射路径/opt/nginx/html/images/1.jpg

location / {

alias /opt/nginx/html/images/;

}

配置默认访问的文件

1.作用:如果用户仅输入了类似于http://example.com/这样的URL而没有具体指定文件名,

Nginx会首先尝试查找index.html文件,如果该文件不存在,就会查找index.htm文件,并将其内容返回给用户

示例:

文件资源放在/usr/share/nginx/html中,若访问/路径会默认访问index.html页面

location / {

root /usr/share/nginx/html;

index index.html index.htm;

}

重定向

1.执行return指令后,location中后序指令将不会被执行

2.重定向时必须以http或者https开头的

#重定向到http://baidu.com

return http://baidu.com;

#返回响应码和文本,文本会在body中

return 200 'your success';

#用302表示临时性重定向,访问/时跳转返回状态码302并重定向到/bbs的路径上

location / {

return 302 /bbs;

}

location /bbs {

root html;

index index.html;

}

核心指令

if【server块或locatio块】

1.false的情况:空字符串、0开头的任意字符串

2.使用=(等于)和!=(不等于)比较变量和字符串是否相等

3.字符串不需要加引号

4.~【大小写敏感】~*【大小写不敏感】!~【】

示例:

$http_user_agent的值中是否包含MSIE字符串,包含为true

if ($http_user_agent ~ MSIE) {

...

}

#判断ip地址是否为192.168.66.10如果是返回test if ok in Url /serach

location /search {

if ($remote_addr = "192.168.66.10"){

return 200 "test if ok in url search"

}

}

#不允许谷歌浏览器访问,如果时候谷歌浏览器返回500

if ($http_user_agent ~ Chrome){

return 500;

}

set 指令

1.作用:该指令用于设置一个新的变量

2.要用符号$作为变量的第一个字符,且变量不能与Nginx服务器预设的全局变量同名

3.变量的值可以是字符串、其他变量或变量的组合等

示例:

set id 1;

break 指令

1.作用:该指令用于中断当前相同作用域中的其他Nginx配置。

示例:

location / {

if ($slow){

set id 1; # 处于break指令之前,配置生效

break;

limit_rate 10k; #处于break指令之后,配置无效

}

}

相关推荐
ping某7 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
BingoGo13 小时前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack13 小时前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982071 天前
PHP 扩展——从入门到理解
php
鹏仔先生2 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理