最近由于线上用到nginx,对其中的结构不太熟悉,故对其进行详细的分析和学习总结,其中借鉴了https://www.zybuluo.com/phper/note/89391, http://seanlook.com/2015/05/17/nginx-install-and-config/(写得非常好)。
关于代理
正向代理:也就是一个代理,其工作原理就是一个跳板,加入我要访问google.com,但不能直接访问,可以通过访问A,A可以访问到google.com,A此时就可以作为一个正向代理。正向代理是一个位于客户端和原始服务器(例如google)之间的服务器,然后代理向原始服务器转交请求并将获得的内容返回给客户端。
反向代理:正好相反,对于客户端来说它就像是原始服务器,并且客户端不需要进行任何特别的设置,客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这部分内容就是它自己的一样。
nginx就是一个非常优秀的反向代理服务器,nginx中的配置文件主要是 nginx.conf,其结构相对来说比较清晰和简单,大致的分块:
main (全局设置) events (nginx工作模式) { .... } http { .... upstream myproject (负载均衡器设置) { ..... } server (主机设置) { .... location (url匹配) { .... } } server { .... location { .... } } .... }
nginx文件中的注释行以#开头, main部分主要属性配置有:
user nobody worker_processes auto; pid logs/nginx.pid; worker_cpu_affinity auto;
运行nginx的用户,这也决定了该进程能否访问的文件系统读写权限。
在linux/unix系统中,一般的进程都会将本进程的pid写到一个磁盘文件中,其中只有一行,用cat命令可以查看。使用文件作为进程锁,可以防止进程启动多个副本,只有获得pid(固定路径固定文件名)写入权限的进程才能正常启动并把自身的pid写入到该文件中,其他同一个程序的多余进程则自动退出。
对于worker_processes,应该为worker角色进程个数,nginx启动后会有多个worker处理http请求,master角色进程并不处理请求,而是根据相应配置文件信息管理worker进程,master进程主要负责接收客户端的请求,并将请求分配给多个worker,每个worker进程负责真正处理请求。
最理想的worker_processes值取决于很多因素,包含但不限于cpu核数,如果设置成自动(auto),会自动检测cpu cores并设置worker_processes参数。如果nginx处理的是cpu密集型,比较耗费cpu的操作,建立将此值设置为cpu个数或cpu核数。
events模块用来指定nginx的工作模式以及连接数上限
events { use kqueue; #mac worker_connections 51200; }
use用来指定nginx的工作模式,支持的有:select, poll, kqueue, epoll, rtsig, /dev/poll,其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,因为Mac基于BSD,所以Mac也得用这个模式,对于Linux系统,epoll工作模式是首选。
worker_connections,每个worker进程能够并发处理(发起)的最大连接数(包含所有连接数)。需要注意的是,这个数量包括了所有连接,与被代理服务之间的连接数,与其他角色之间的,不仅仅是与客户端的,另一个需要注意的是这个实际的值不能超过当前最大文件打开数量(worker_rlimit_nofile)。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
http模块是最核心的模块,负责http服务器相关属性的配置:
include mime.types; default_type application/octet-stream; #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 on; log_format main '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time'; access_log /usr/local/etc/nginx/logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on;
include 来用设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别文件类型。
default_type设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置asp 的locate 环境时,Nginx是不予解析的,此时,用浏览器访问asp文件就会出现下载了。
sendfile on可以开启高效文件传输模式,将tcp_nopush和tcp_nodelay两个属性设置成on用于防止网络阻塞。
keepalive_timeout设置客户端连接保持活动的超时时间,超过后服务器会关闭该连接。
server模块在http模块范围内,为子模块,用来定义一个虚拟主机,一个简单的server定义实例:
server { #定义虚拟主机开始 listen 8080; #指定虚拟机主机的服务端口 server_name localhost 192.168.1.130 www.aaa.com; #指定ip地址或者域名,多个域名用空格分开 # 全局定义,如果都是这一个目录,这样定义最简单。 root /Users/yangyi/www; #server虚拟机内全部的root web根目录 index index.php index.html index.htm; #定义全局访问默认地址 charset utf-8; # 网页默认编码格式 access_log usr/local/var/log/host.access.log main; #访问日志 error_log usr/local/var/log/host.error.log error; #错误日志 .... }
location模块是nginx中使用率非常高的,也很重要,用来定位和解析URL,提供了强大的正则表达式功能,同时支持条件判断匹配,用户可以通过location指令实现nginx对动静网页进行过滤处理。
location / 表示匹配访问根目录,root指定指定访问根目录时虚拟主机的web目录,该目录可以是相对路径(相对nginx),也可以为绝对路径。
默认的首页和虚拟机目录,index用于设定我们只输入域名后的默认首页地址。
location / { root /Users/aaa/www; index index.php index.html index.htm; }
此外,location还可以进行正则匹配,例如php环境的配置:
location ~ \.php$ { root /Users/aaa/www; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; }
nginx中提供了强大而简单的负载均衡功能,使用的是upstream模块,一个简单的例子:
upstream webservers{ server 192.168.33.11 weight=10; server 192.168.33.12 weight=10; server 192.168.33.13 weight=10; } server { listen 80; server_name upstream.iyangyi.com; access_log /usr/local/var/log/nginx/upstream.iyangyi.access.log main; error_log /usr/local/var/log/nginx/upstream.iyangyi.error.log error; location / { proxy_pass http://webservers; proxy_set_header X-Real-IP $remote_addr; } }
通过 location的proxy_pass来将请求导至 webservers中(名称可自定义),定义的upstream将请求根据weight(权重)分发至对应的3台服务器中,在upstream模块中还有另外的参数:
- max_fails: 允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误;
- fail_timeout: 在经理max_fails次失败后,暂停服务的时间,与max_fails一起使用,进行服务器健康状态检查。
当失败2次后,就停止30秒该服务。
server 192.168.1.130 weight=1 max_fails=2 fail_timeouts=30s;
- down:该服务器暂时不参与负载均衡,相当于注释;
- backup:这台机器是备份服务器,当其他服务器不可用时才使用;
upstream可以使用某种负载均衡算法来进行调度,当前支持的有:
- weight轮询(默认),每个请求按照顺序逐一分配,会自动剔除宕机的服务器;
- ip_hash,每个请求按访问ip的hash结果分配,同一个ip的访客会固定访问同一台服务器,解决动态网页存在的session共享问题;
- fair,只能负载均衡算法,根据页面大小和加载时间长短智能地进行负载均衡,根据后端服务器的响应时间来分配请求,需要下载upstream_fair来支持该算法;
- url_hash,根据访问url进行hash的结果来分配请求,使得每个url定向到同一个服务器,进一步提高后端缓存服务器的效率,需要下载hash软件包支持该算法;
注意,当选择ip_hash时,weight和backup参数会失效。
日志
nginx中有两种日志,访问日志和错误日志。其中访问日志记录客户端访问nginx的每一个请求,包括用户地域来源,跳转来源,使用终端某个url访问量等,访问日志可以自定义;错误日志则记录用户访问nginx出错时的日志,格式不支持自定义,通过错误日志可以得到系统某个服务或server的性能瓶颈。
在http中打开访问日志,access_log属性为on,access_log指定日志的地址
access_log on; log_format main '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time'; access_log /usr/local/etc/nginx/logs/access.log main;
log_format指定日志的格式,其中$后面就是nginx中定义的变量,如果按照上面的配置,日志如下:
[31/Oct/2016:20:43:27 +0800] 127.0.0.1 - - - localhost to: 119.254.109.163:8081: GET /home/homePage/getHomeImg.json HTTP/1.1 upstream_response_time 0.165 msec 1477917807.635 request_time 0.165
日志中属性的含义:
属性名称 | 属性含义 | |
$remote_addr | 与$http_x_forwarded_for 用以记录客户端的ip地址 | |
$time_local | 记录访问时间与时区 | |
$remote_user | 记录客户端用户名称 | |
$request | 记录请求的url与http协议 | |
$request_uri | /stat.php?id=1585378&web_id=1585378 | |
$request_time | 请求的耗时 | 0.205 |
$connection | 所用连接序号 | |
$http_referer | 用来记录从哪个页面链接过来的 | |
$http_user_agent | 记录客户端浏览器的相关信息 | “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C; |
$body_bytes_sent | 记录发送给客户端文件主体内容大小 | |
$status | 记录请求状态;成功是200 | |
$http_host | 请求地址,即浏览器中你输入的地址(IP或域名) |
img.alipay.com
10.253.70.103
|
$upstream_status | upstream状态 | 200 |
$ssl_protocol | SSL协议版本 | TLSv1 |
$ssl_cipher | 交换数据中的算法 | RC4-SHA |
nginx常见问题
出现nginx pid文件失败,使用nginx -s reload时,需要根据pid文件中的进程id(pid)来重新加载配置,如果没有一个已经运行的nginx进程,就无法向其发送信号(signal),此时直接运行nginx即可。
nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)
在淘宝改进的tengine中,有些访问日志字段不支持,例如在我们的环境中$upstream_addr就不起作用。
相关推荐
下面是Nginx的完整配置说明,涵盖基本配置、反向代理、FastCGI等方面的知识点。 一、基本配置 在配置文件中,我们首先需要指定用户和用户组,使用`user`指令,并指定工作进程的数量,使用`worker_processes`指令。...
"02nginx动态配置.zip"这个压缩包文件提供了关于如何管理和配置Nginx的一些基本操作,旨在帮助用户更好地理解和应用Nginx。下面我们将深入探讨Nginx的配置、启动、关闭和重启过程。 ### 1. Nginx配置 Nginx的配置...
第三章:Nginx的基本配置与优化 此章深入讨论Nginx的配置文件语法,包括指令、模块和参数。你将学习如何配置Nginx处理静态文件、动态内容(如PHP或Java应用)的代理,以及URL重写规则,以实现高效的路由。此外,本章...
这个配置可以作为基本的Windows环境下PHP和Nginx的搭建教程,但实际应用中可能需要根据项目需求进行更复杂的配置,比如添加SSL支持、负载均衡、缓存设置等。持续学习和理解Nginx和PHP的配置选项,可以帮助你更好地...
建议读者先熟悉基本的NGINX概念和Tomcat基础知识,再深入学习本文档。 #### 二、术语、定义和缩略语 **术语、定义:** - **NGINX**: 高性能的HTTP和反向代理Web服务器,常用于负载均衡场景。 - **Tomcat**: 开源...
本篇将详细介绍如何在Linux系统上安装Nginx,以及进行基本的配置实践。 首先,我们需要了解Nginx的安装过程。在大多数Linux发行版中,可以通过包管理器来安装Nginx。例如,在Ubuntu或Debian系统中,可以使用`apt-...
通过以上配置,我们不仅了解了 Nginx 的基本配置方法,还深入学习了如何配置 HTTPS 服务。HTTPS 的实现不仅提升了网站的安全性,也为用户提供了更可靠的数据传输保障。此外,通过配置不同的 Server 块,可以灵活地...
**Nginx安装配置详解** Nginx是一款高性能的HTTP和反向代理服务器,广泛用于网站的负载均衡和内容分发。...对于更复杂的场景,如SSL/TLS支持、URL重写、缓存管理等,你可能需要进一步深入学习Nginx的高级配置。
1. **Nginx基本配置与优化** - Nginx的核心配置文件是`nginx.conf`,其中包含了全局块、events块、http块和server块等结构。理解这些配置块的作用是掌握Nginx的基础。 - `worker_processes`参数设定工作进程数量,...
基本配置文件结构如下: ```nginx http { server { listen 80; # 监听80端口 server_name example.com; # 指定服务器域名 location / { # 默认路由 root /var/www/html/dist; # 设置静态资源目录为dist ...
包含多个server块,定义HTTP服务器的基本配置,如日志格式、编码类型等。 4. **server块** 表示一个独立的HTTP服务器,通常对应一个域名或IP地址,可以包含多个location块。 5. **location块** 根据请求的URL...
Nginx学习笔记 Nginx 是一个流行的开源 Web 服务器软件,能够处理高并发请求,常用于搭建高性能的 Web 服务器。本文将对 Nginx 的安装、配置、日志管理等方面进行详细的介绍。 一、Nginx 的安装 Nginx 的安装可以...
### 二、Nginx的基本配置 Nginx的配置文件通常位于`/etc/nginx/nginx.conf`,包括多个服务器(server)配置块。每个服务器配置块可以定义监听的端口、虚拟主机、重定向规则等。 以下是一个基本的配置示例: ```...
对于一个新手来说,理解Nginx的基本配置文件结构是第一步。Nginx的配置文件通常位于etc/nginx/nginx.conf,还包括了各种特定的配置文件,通常放在etc/nginx/conf.d目录下。每一个配置文件通常包含三部分:全局块、...
**Nginx源码学习资料概述** Nginx是一款高性能的HTTP和反向代理服务器,以其轻量级、高并发处理能力以及优秀的稳定性而受到广大Web开发者和运维人员的青睐。学习Nginx源码有助于深入理解其工作原理,提高在实际应用...
1. **基本配置**:Nginx的配置文件通常包含`user`(运行Nginx的服务用户和组)、`worker_processes`(工作进程数量,可根据服务器性能调整)和`error_log`(错误日志路径)等基本信息。`pid`指令指定Nginx主进程的...
第3章 Nginx的基本配置与优化 第4章 Nginx与PHP(FastCGI)的安装、配置与优化 第5章 Nginx与JSP、ASP.NET、Perl的安装与配置 第6章 Nginx HTTP负载均衡和反向代理的配置与优化 第7章 Nginx的Rewrite规则与实例 第8章 ...
基本配置 Nginx 的配置文件位于 conf 目录下,主要包括以下几个目录: * conf:配置文件目录 * html:网页文件目录 * logs:日志文件目录 * sbin:主要二进制程序目录 启动与停止 启动 Nginx 需要使用 ./sbin/...
在本文中,我们将深入探讨如何在Ubuntu操作系统上安装和配置Nginx服务器,这是一个流行的开源Web服务器,以其高性能和稳定性而闻名。...通过不断学习和实践,你可以进一步优化Nginx配置,提升Web应用的性能和可靠性。