目录
一、概述
- 官方中文文档:传送门
1.1 服务器文件分布
- /etc/nginx/
# nginx可以代理多个网站,每个网站分配一个虚拟主机, # 此文件夹内可配置每个域名对应的虚拟主机, # 内部*.conf文件均会包含进nginx.conf文件内 drwxr-xr-x 1 root root conf.d # 使用快速通用网关接口 配置参数:见0.2节 -rw-r--r-- 1 root root fastcgi_params # 使用简单通用网管接口规范 配置参数:见0.2节 -rw-r--r-- 1 root root scgi_params # 使用Web服务网关接口规范 配置参数:见0.2节 -rw-r--r-- 1 root root uwsgi_params # nginx解析文件类型: 内容如 text/css css;等 -rw-r--r-- 1 root root mime.types # nginx服务器的模块存放位置 lrwxrwxrwx 1 root root modules -> /usr/lib/nginx/modules # nginx主配置文件,内有include语句包含第一个文件夹内所有*.conf文件 -rw-r--r-- 1 root root nginx.conf
- /var/log/nginx/*.log:所有Nginx日志文件
- /usr/share/nginx/html/*.html:配置文件在此文件夹中找index.html文件返回前端(*.conf配置)
1.2 网关接口规范
-
CGI(Common Gateway Interface,通用网关接口)
CGI 是一种通用网关接口规范,该规范详细描述了 Web 服务器和请求处理程序(脚本解析器)在获取及返回数据过程中传输数据的标准,如 HTTP 协议的参数名称等。大多数 Web 程序以脚本形式接收并处理请求,然后返回相应数据,如脚本程序 PHP、JSP、Python 等。 -
FastCGI(Fast Common Gateway Interface,快速通用网关接口)
FastCGI 是 CGI 的增强版本,其将请求处理程序独立于 Web 服务器之外,并通过减少系统为创建进程而产生的系统开销,使 Web 服务器可以处理更多的 Web 请求。FastCGI 与 CGI 的区别在于,FastCGI 不像 CGI 那样对 Web 服务器的每个请求均建立一个进程进行请求处理,而是由 FastCGI 服务进程接收 Web 服务器的请求后,由自己的进程自行创建线程完成请求处理。 -
SCGI(Simple Common Gateway Interface,简单通用网关接口)
SCGI 是 CGI 的替代版本,它与 FastCGI 类似,同样是将请求处理程序独立于 Web 服务器之外,但更容易实现,性能比 FastCGI 要弱一些。 -
WSGI(Web Server Gateway Interface,Web 服务网关接口)
WSGI 是为 Python 语言中定义的 Web 服务器与 Python 应用程序或框架间的通用通信接口,可以使 Python 应用程序或框架与支持这一协议的不同Web服务器进行通信。常见的 Python Web 框架都实现了该协议的封装。
参照博客
二、nginx.conf文件
2.1 通用配置
- 文件内容
###################通用配置################### # 定义Nginx运行的用户名 user nginx; # nginx进程数,不大于CPU核数,此处自动判断 worker_processes auto; # 全局错误日志定义类型,记录严重性≥以下选定的选项 # [ debug | info | notice | warn | error(默认) | crit | alert | emerg ] error_log /usr/local/nginx/logs/error.log info; # 进程pid文件 pid /usr/local/nginx/logs/nginx.pid; # 一个nginx的worker进程可以打开的最多文件数目 # 默认ulimit -a中限值,此项覆盖上个命令,选此值即可 worker_rlimit_nofile 65535; # 参考事件模型:针对不同系统有不同的Nginx模板 events { # 见2.2节:event模块 } # http服务器设置区 http { # http全局配置区:见2.3.1节 # 负载均衡:见2.3.2节 # 虚拟主机配置区:此块可以有多个,通过内部server_name区分 server { # 见2.3.3节 } # 此处也为http全局配置区 }
2.2 event模块
- 模块内容
events { # 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; # epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,默认 use epoll; # 单个Nginx的worker进程最大连接数,不超过2.1的worker_rlimit_nofile项 worker_connections 65535; # 收到一个新连接通知后接受尽可能多的连接,否则一个工作进程只能同时接受一个新的连接 multi_accept on; }
2.3 http模块
2.3.1 http全局设置
- 通用配置
http { # include 引入包含文件,将其他配置文件插入此处, # mime.types:文件扩展名与文件类型映射表,如:application/json json等 # post请求头中、响应头中的Content-Type项,在http中用于标识传输数据的类型 # 查Mime 类型映射表获取详细映射 include mime.types; # 默认文件类型:二进制流数据,不在上述映射表中即以此标识数据流 default_type application/octet-stream; #默认编码 #charset utf-8; # 服务器名字的hash表大小,配置多个server虚拟主机必须配置, # 否则nginx 启动不了,而且nginx -t命令错误 server_names_hash_bucket_size 512; #客户端请求头部的缓冲区大小,默认即可 client_header_buffer_size 32k; #客户请求头缓冲超若上一条,用这一条救急 large_client_header_buffers 4 32k; #设定请求体大小,常用来限制上传文件大小 client_max_body_size 50m; # 文件上传:普通应用,必须设为on,指令指定nginx是否调用sendfile函数 # (zero copy)来输出文件,如果用来进行下载等应用磁盘IO重负载应用,可 # 设置为off,以平衡磁盘与网络IO处理速度 sendfile on; # 开启目录列表访问,适合下载服务器,默认关闭 # 功能类似镜像网站,如 http://mirrors.aliyun.com/centos/7/ autoindex on; # 针对sendfile开启时才启用此设置, # 数据包会累计到一定大小之后才会发送 tcp_nopush on; # 针对处于keep-alive状态的TCP连接才启用此设置, # 数据包不缓存,直接发送 tcp_nodelay on; # 连接超时时间,单位是秒 keepalive_timeout 60; #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 256k; fastcgi_intercept_errors on; # gzip模块设置 #开启gzip压缩输出 gzip on; # 响应头的"Content-Length"大于1k时才压缩 gzip_min_length 1k; # 压缩缓冲区 gzip_buffers 4 16k; # 压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_http_version 1.1; #压缩等级:4~6 gzip_comp_level 4; # 压缩类型:对应mime.types文件的映射表 gzip_types text/plain application/x-javascript text/css application/xml; # 若请求头包含常规Accept协商字段之外的请求头字段,那么响应头中必须包含 Vary 字段 # 例如 User-Agent, Cookie这些 gzip_vary on; # limit_zone限制客户端连接的模块 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; # nginx隐藏版本号,防止针对软件版本的漏洞攻击 server_tokens = off ...... }
2.3.2 负载均衡
- 配置文件注释
http { # 全局配置区 ...... # 负载均衡区:可定义多个负载均衡 # 1、轮询 # weight是权重,权值越高被分配到的几率越大。 upstream server_pool_1 { server 192.168.1.2:80 weight=3; server 192.168.1.3:80 weight=2; server 192.168.1.4:80 weight=3; } # 2、ip_hash # 每个请求按访问ip的hash结果分配,这样每个访客固定访问 # 一个后端服务器,可以解决session的问题 upstream server_pool_2 { ip_hash; server 192.168.1.11:80; server 192.168.1.12:80; } # 3、fair(第三方) # 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream server_pool_3 { server 192.168.1.21:80;; server 192.168.1.22:80;; fair; } # 定义负载均衡设备的Ip及设备状态 upstream server_pool_4 { ip_hash; # 当前的server暂时不参与负载 server 127.0.0.1:9090 down; server 127.0.0.1:8080 weight=2; server 127.0.0.1:6060; # 当其它所有非backup机器忙的时候,才请求此机器 server 127.0.0.1:7070 backup; } # 在需要使用负载均衡的server中增加 proxy_pass http://server_pool_1/; ...... }
2.3.3 虚拟主机
1 虚拟主机配置
- 配置文件注释
http { # 全局配置区 ...... # 负载均衡区 ...... # 虚拟主机:同一台主机上可以有多个虚拟主机,虚拟主机之间是完全独立的, # 每台虚拟主机都可以作为一个独立的网站, # 可以具有独立的域名,具有完整的Intenet服务器功能 server { # Nginx通过:域名:端口 匹配对应的虚拟主机, # 并通过location匹配对应的路由, # 虚拟主机监听端口:一个端口可以多个虚拟主机监听 listen 80; # 虚拟主机域名:没域名写IP地址, # 可以有多个,用空格隔开,可以使用正则表达式 server_name doubi.com 192.168.1.111; # 进入默认根目录寻找以下文件 index index.html index.htm index.php; # 默认根目录,若location中有root或alias,则拼接在此后面 root /www/wwwroot/doubi.com; # 图片缓存时间设置,location见下节 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; error_log /dev/null; access_log /dev/null; } # JS和CSS缓存时间设置,location见下节 location ~ .*.(js|css)?$ { expires 1h; error_log /dev/null; access_log /dev/null; } #################反向代理################ # 访问http://doubi.com/api/地址时,会转发到 # http://127.0.0.1:6666/,6666接口收到的客户 # ip始终为127.0.0.1,反向代理见文末 location /api/ { proxy_pass http://127.0.0.1:6666/; proxy_connect_timeout 10; } # 此处反向代理到上面负载均衡server_pool_1中 location /api2/ { proxy_pass http://server_pool_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:记录客户浏览器的相关信息; # 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了, # 通过$remote_add拿到的IP地址是反向代理服务器的iP地址。 # 反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息, # 用以记录原有客户端的IP地址和原来客户端的请求的服务器地址 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #定义本虚拟主机的访问日志,main为上一条的日志格式名 access_log /www/wwwlogs/doubi.com.log main; error_log /www/wwwlogs/doubi.com.error.log main; } # 可以再接着写 server { ...... } }
2 location路由匹配
-
格式
server { ...... location [=|~|^~] /uri/ { # 匹配到路由后的操作 } ...... }
-
路径优先级
优先级 匹配写法 匹配意义 1 = /a/
精准匹配符 =
,路由起始为/a/
即匹配2 ^~ /a/
非正则匹配符 ^~
,路由起始为/a/
即匹,注意空格位置3 ~ .*\.m$
正则匹配符 ~
,路由不一定为起始匹配后缀名为.m的路由,如/a/1.m
,注意空格;写法:~* 正则表达式
,不区分大小写的正则匹配;默认非从头开始匹配,详见正则写法4 /static/
普通匹配,路由起始为/static/的; /
匹配任意路由,优先级最低
-
单一类型命中
- 命中的路由包含1:最高优先级原则
location = /a/ { return 401; } # http://localhost/a/b/,路由起始匹配即返回,不再匹配2~4
- 命中多个1或2或4:最长命中原则
location = /a/ { return 401; } location = /a/b/ { return 402; } # http://localhost/a/, 返回401 # http://localhost/a/b/, 返回402 # http://localhost/a/b/c/,返回402
- 命中多个3:书写优先原则
location ~ /a/ { return 401; } location ~ /b/ { return 402; } # http://localhost/a/b/,返回401 location ~ /b/ { return 402; } location ~ /a/ { return 401; } # http://localhost/a/b/,返回402
- 命中的路由包含1:最高优先级原则
-
复合类型命中(排列组合)
- 同时命中2和3:返回2,此处3被屏蔽
location ^~ /a/ { return 401; } location ~ /a/b/ { return 402; } # http://localhost/a/b/,返回401 # http://localhost/c/a/b/,返回402,注意第一个未被命中,非起始路由
- 同时命中2和4:最长命中原则,2和3和4 等价于2和4,因为此处3被屏蔽
location ^~ /a/ { return 401; } location ~ /a/b/ { return 402; } location /a/b/c/ { return 403; } # http://localhost/a/b/c/d/,返回403,跟书写顺序无关
- 同时命中3和4:返回3
location ~ /a/b/ { return 402; } location /a/b/c/ { return 403; } # http://localhost/a/b/c/d/,返回402,跟书写顺序无关
- 同时命中2和3:返回2,此处3被屏蔽
3 反向代理、root、alias、index
- 反向代理
# 访问 http://域名/api/a/ 时,nginx会将请求转发到 # http://127.0.0.1:6666/a/,6666接口收到的客户 # ip始终为127.0.0.1, location /api/ { proxy_pass http://127.0.0.1:6666/; # 将客户端真实IP也转发给后端 proxy_set_header X-Real-IP $remote_addr; } # 此处反向代理到负载均衡server_pool_1中 location /api2/ { proxy_pass http://server_pool_1/; # 将客户端真实IP也转发给后端 proxy_set_header X-Real-IP $remote_addr; } # 联合uwsgi服务器 location /api3/ { include uwsgi_params; # 此处会将路由完整追加到*:2048后 uwsgi_pass 192.168.1.217:2048; # 以下语句用于传递客户端真实IP:Django用request.META['X-Real-IP'] uwsgi_param X-Real-IP $remote_addr; uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for; uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto; }
- root与alias
location /img/ { alias /var/; } # 路由别名:请求/img/1.jpg时,Nginx会获得/var/1.jpg # 只可在location中使用,若serve{}全局配置有root,会与此处拼接 location /img/ { root /var; } # 根目录拼接:请求/img/1.jpg时,Nginx会获得/var/img/1.jpg # 即将/var拼接到/img/前,若serve{}全局配置有root,会与此处拼接
- index指令
location /other/ { root /www/wwwroot/; # 路由/other/会将/www/wwwroot/index.html文件返回前端 # 多个选择,用空格分隔 index index.html index.php; }
4 动静分离
- 功能:使一个子域名下的资源为只读,且可作为前端引用,如:图片、js、css
- 文件准备
- 新建:/data/image/1.png
- 新建:/data/www/index.html,内容
<h1>这是静态页面主页<h1>
- 新建:/etc/nginx/conf.d/nginx.conf
server { listen 80; server_name 192.168.3.5; # 路由为/data/image/ location /image/ { root /data; # 在浏览器路由为/image/时会显示列表,见下图 autoindex on; } # 跟上一个效果相同 location /src/ { alias /data/image/; autoindex on; } # 路由/data/www/index.html location / { root /data/www; index index.html; } }
- 显示/image/路由,或/src/路由
- 显示/image/1.png,或/src/1.png
- 显示192.168.3.5/