nginx目前在市场上使用是非常广泛的,作为一个开发人员,可以不会nginx的高级使用,但是基本的使用场景以及日常问题排查技能还是要有的。nginx使用的方向主要有三个,分别是路由功能、负载均衡功能以及静态资源服务功能。路由功能主要是用来将不同请求分发到不用的服务上,负载均衡是将请求分发到一个服务的集群中的不同虚拟机上,这两种有一点类似,但是存在本质的区别。再就是静态资源服务功能,以前的开发和现在的小公司服务,习惯将静态资源直接放在项目下,但是随着公司产品量和服务量的增多,静态资源自然也会增长,如果继续放在项目下,就会增加项目的压力。所以单独出来建立对应的静态资源服务器也是很常见的,这个时候就需要将静态资源的请求路由到对应静态资源服务器上。
nginx的三种使用场景
路由服务功能
对外提供服务不会直接将机器暴露给外界提供访问(安全问题),往往是提供统一的路由机器,由路由机器来将请求分发到内部提供真实服务的服务器上,处理请求后再通过路由机器响应给请求方。内部服务器很多,具体需要路由到那一台机器,这是就可以用到nginx的路由服务功能。实现思路如下:
负载均衡功能
负载均衡,一个服务集群部署,由多个机器组成,为了不让一台机器的压力过大而造成崩溃发现,就需要将所有的请求均衡的分配到每一台机器中,既能提高响应的速度也能降低单台机器的压力。nginx可以通过配置多台机器的负载实现。实现思路如下:
静态资源服务功能
这个其实和路由服务基本相同,只不过是将业务服务的路由改成静态资源服务的路由,另外加上一些静态资源的一些优化策略,让静态资源的响应速度更快,更有效(如静态资源的压缩,降低传输数据的量,提高传输速度)。实现思路可以参照路由服务功能。
linux环境下安装nginx
安装方式一
这种方式是推荐的,等说完第二种方式再做一个对比。安装步骤如下:
-
在
/usr/local/
目录下使用wget下载nginx资源包wget http://nginx.org/download/nginx-1.9.0.tar.gz
-
将下载的资源包使用tar命令解压,并进入到解压后的目录中
tar -zxvf nginx-1.9.0.tar.gz cd nginx-1.9.0
-
配置nginx的安装目录
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
如果上面的shell脚本执行后没有执行成功,是因为缺少相关的依赖工具,需要提前安装依赖后再重新执行上面的命令,安装依赖命令如下:
yum -y install pcre pcre-devel yum -y install zlib zlib-devel yum install -y openssl openssl-devel
-
编译&&安装nginx
make && make install
-
使用whereis命令去看看nginx的安装目录
whereis nginx
查询的结果:
nginx: /usr/local/nginx
这里看到nginx就是安装在上面configure配置的路径下面,在说第二种安装方式的时候会进行一个比较。
安装方式二
这种安装方式很简单,很省事。执行下面的命令即可。
yum -y install nginx
如果上面的命令执行报错,说明需要安装yum的epel-release扩展源。命令也很简单。如下:
yum -y install epel-release
到这里就安装结束了,看着比第一种方式要简单的很多,但是存在一个问题。执行一下whereis nginx
命令,得到的输出结果如下:
nginx: /usr/sbin/nginx /etc/nginx /usr/lib64/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz
安装后的nginx被放到了不同的位置,分散开的,这个为后期的配置文件修改,日志查看提供了很大的不便,没有第一种方式好,统一放在一个指定的目录下。
nginx中的常用命令
nginx命令
启动命令:
/usr/local/nginx/sbin/nginx
重启命令:
/usr/local/nginx/sbin/nginx -s reload
停止命令:
/usr/local/nginx/sbin/nginx -s stop
检查配置文件是否正确(一般用于修改配置文件后重启之前,做配置文件正确性检查):
/usr/local/nginx/sbin/nginx -t
指定配置文件位置启动或重启:
/usr/local/nginx/sbin/nginx/ -c /usr/local/nginx.conf
或
/usr/local/nginx/sbin/nginx/ -c /usr/local/nginx.conf -s reload
nginx控制信号
nginx启动后,对应的pid是存在nginx目录下的nginx.pid
文件中。可以通过cat
命令读取文件获取pid。也可以通过ps -ef | grep nginx
命令来获取pid。
主进程可处理信号:
TERM
,INT
:表示快速关闭QUIT
:从容的关闭HUP
:重载配置,用新的配置开始新的工作进程,从容关闭旧的工作进程USR1
:重新打开日志文件USR2
:平滑升级可执行程序WINCH
:从容关闭工作进程
发送控制信号的方式:
kill -TERM pid
#或者(/usr/local/nginx/是nginx的安装目录)
kill -TERM cat /usr/local/nginx/nginx.pid
nginx配置文件的初认识
nginx配置文件整体布局
nginx配置文件中主要分三个模块,分别是主全局配置、工作模型及连接上限配置、http服务相关属性。
- 全局配置:里面包含的信息由当前用户信息、工作进程数(worker_processes 数量默认是机器的核心数,可以手动设置,一般推荐设置为核心数的两倍)、全局日志以及日志的级别设置、nginx进程的pid信息等。
- 工作模型和连接上限:工作模型默认是epoll,连接上限(worker_connections)默认是1024。
- http服务相关属性:其中包含http服务的全局设置,以及对应Server配置。每个Server路由到不同服务,可以使用upStream配置负载均衡,以及根据Location配置URL匹配的位置等。
nginx配置参数说明
worker_processes
:工作进程数,默认是当前机器的核心数。pid
:当前nginx的进程编号,默认存储在logs/nginx.pid文件中。worker_connections
:连接上限,默认设值是1024。max_clients
:最大客户端连接数,这个是不会手动的设置,而是通过worker_processes和worker_connections相乘计算得到,如果是反向代理,需要除以4。log_format
:日志格式,可以定义多个,然后在定义具体日志的时候采用不同的格式。(根据指定格式生成日志,可以给大数据分析提供数据源)keepalive_timeout
:连接超时时间,表示浏览器发送请求,nginx转发到对应的服务器并等待服务器响应,如果超过这个连接时间,就不会再继续等待。listen
:表示监听的端口,此配置是放在http的server下。(http请求一般监听都是80端口,而https请求监听的是443端口)server_name
:监听的服务名称,如上面图中提到的www.itcrud.com
、order.itcrud.com
等。location
:指定URL匹配特定服务的位置和相关配置信息。error_page
:指定对应的响应码,当服务出现对应的错误时,给出相应的错误页面信息展示。
常用全局变量
这里的日志和应用的日志是类似的,使用不同的占位符来表示不同的信息,然后打印日志的时候,使用全局变量进行填充,形成一条具体的日志信息。当然这些全局变量不仅仅可以用于日志输出的方式,还可以用于一些请求参数的设值等。
$remote_addr
:客户端的IP地址(代理服务器,显示代理服务器IP)$remote_user
:用于记录远程客户端的用户名称(一般是“-”)$time_local
:用于记录访问时间和时区$request
:响应状态码$body_bytes_send
:给客户端发送的文件主体内容字节数$http_user_agent
:用户使用的代理(一般为浏览器)$http_x_forwarded_for
:可以记录客户端IP,通过代理服务器来记录客户端的IP地址$http_referer
:可以记录用户是从哪个连接访问过来的$args
:请求行中的参数$content_length
:请求头中Content-length字段$content_type
:请求头中的Content-type字段$document_root
:当前请求的root指令中指定的值$remote_port
:客户端端口$request_filename
:当前请求的文件路径,由root或者alias指令与URI请求生成$limit_rate
:这个变量可以限制连接速率$host
:请求主机头字段,否则为服务器名称$http_cookie
:客户端cookie信息$http_user_agent
:客户端agent信息$scheme
:HTTP方法(如:http,https)$uri
:不带请求参数的当前URI,不包含主机名,和$document_uri
相同$request_uri
:包含请求参数的原始URI,不包含主机名$server_protocol
:请求使用的协议,通常是HTTP/1.0或HTTP/1.1$server_addr
:服务器机制,在完成一次调用后可以确定此值$server_name
:服务器名称$server_port
:请求到达服务器的端口号