简介
以下是摘自官方的介绍:
Nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server.
Nginx是engine x的缩写,它是一款HTTP服务器,也是反向代理服务器,还能当邮件代理服务器,以及通用TCP/UDP代理服务器。
基本用法
使用Nginx之前,需要了解几个基本的命令:
# 发送命令(-s signal) nginx -s #打开 nginx nginx #测试配置文件是否有语法错误 nginx -t #重启Nginx nginx -s reopen #重新加载Nginx配置文件,然后以优雅的方式重启Nginx nginx -s reload #强制停止Nginx服务 nginx -s stop #优雅地停止Nginx服务(即处理完所有请求后再停止服务) nginx -s quit
Nginx的核心是其配置文件——nginx.conf,一般位于/etc/nginx/(这也是其他配置文件的目录)。要使用Nginx,首先必须要掌握nginx.conf相关内容。
nginx.conf配置文件主要由三大部分构成:1、主上下文(main context)配置;2、events配置块;3、http配置块。
主上下文配置
# user user [group];定义工作进程认可的用户和用户组。 user html; # worker_processes number | auto;定义工作进程数。 worker_processes 1; # error_log file [level];定义默认的错误日志文件。level可以是debug, info, notice, warn, error, crit, alert, emerg。 error_log logs/error.log; # 定义记录主进程ID的文件。 pid logs/nginx.pid; # 定义Nginx是否作为守护进程。主要用于开发阶段。 daemon on | off; # 向当前配置文件引入另一个file文件,或者是满足mask的文件。引入的文件需要保证指令和块的正确性。 include file | mask;
更多主上下文配置,请参考官方提供的核心功能列表。
events配置块
events { # 定义工作进程可以同时打开的最大连接数。 worker_connections 1024; }
events配置块主要用于设置与连接进程相关的命令。
更多events配置块的配置,请参考官方提供的核心功能列表中,Context为events的命令。
HTTP配置块
以Nginx默认配置为例,下面配置注释简单解释了HTTP配置块的主要组成部分。
http { # 导入mime.types文件。mime.types中定义了各种类型的媒体格式。 include mime.types; # 定义响应的默认mime格式。可以通过查看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 logs/access.log main; # 定义是否使用sendfile()方法传输文件。 # 它在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称为零拷贝。 sendfile on; # 定义是和否调用TCP_NOPUSH/TCP_CORK。该配置当且仅当sendfile开启时生效。 tcp_nopush on; # keepalive_timeout timeout [header_timeout];定义客户端连接的存活时间,如果timeout=0,则禁止客户端存活(keep alive)。 # 第二个参数设置的是header里的属性。 keepalive_timeout 65; # 定义是否开启gzip的响应 gzip on; # server块配置 server {...} }
HTTP配置块主要用于配置HTTP服务器相关的指令。该块包括全局变量,server配置块两个部分。其中,server配置块还包括location配置块。
下面是官方文档对server块的定义:
Sets configuration for a virtual server. There is no clear separation between IP-based (based on the IP address) and name-based (based on the “Host” request header field) virtual servers. Instead, the listen directives describe all addresses and ports that should accept connections for the server, and the server_name directive lists all server names. Example configurations are provided in the “How nginx processes a request” document.
server配置块主要作用是配置了一台虚拟服务器。至于是基于Ip地址还是基于服务器名并没有明确的界限。其中listen指令表示该虚拟服务器需要匹配的Ip地址和端口;server_name指令表示该虚拟服务器需要匹配的服务器名。配置示例可以参考《How nginx processes a request》。
这里需要指出两点,也是《How nginx processes a request》一文中有解释的:
- 当listen中同时配置了Ip地址和端口,同时还配置了server_name,Nginx会优先匹配Ip地址和端口。
- 当Ip地址和端口匹配,但是不存在对应的server_name时,第一个server配置块是默认的配置。
更多HTTP配置块的配置,请参考官方提供的HTTP核心配置列表,以及官方文档Modules reference部分以ngx_http_开头的配置。
Nginx的特点
Nginx主要有以下四个功能/特点:
- 反向代理
- 动静分离
- 负载均衡
- 高可用
下面,就以上几个方面进行Nginx入门介绍。
反向代理
个人理解,正向代理还是反向代理的区别在于代理对象。正向代理的代理对象是客户端(即隐藏真实客户),反向代理的代理对象是服务端(即隐藏真实提供商)。
之前看到一个有趣的例子:
正向代理:甲想向丙借钱,但是甲和丙有矛盾,甲通过乙向丙借到了钱。此时,乙是甲的代理,丙不知道是甲借钱。
反向代理:甲向乙借钱,乙知道丙有很多钱,于是乙借了丙的钱给甲。此时,乙是丙的代理,甲不知道丙。
通过上面简单描述,如何使用Nginx配置反向代理就简单明了了。只需配置好server配置块即可。例:
server { location / { proxy_pass http://remote:8080/; } }
此例中,当客户端请求根目录时,将被反向代理至http://remote:8080/,即Nginx知道http://remote:8080/这儿有很多钱。
动静分离
个人理解,动静分离的“动”类似jsp需要服务端处理,“静”类似image可以直接读取。因此实现动静分离可以理解为在反向代理的基础上,把静态资源放在本地。例:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
此例中,当客户端请求根目录时,将会被反向代理至http://localhost:8080/。当然,这个地址可以是远程服务器地址。当客户端请求图片时,将会直接去/data/images中查找图片。
负载均衡
负载均衡,简单理解,一万块钱以某种方式平均分给多个人用。
在Nginx中,提供有以下几种“分钱”的方式:
- round-robin — requests to the application servers are distributed in a round-robin fashion,
- least-connected — next request is assigned to the server with the least number of active connections,
- ip-hash — a hash-function is used to determine what server should be selected for the next request (based on the client’s IP address).
- 轮询方式——默认负载均衡算法。按配置中的虚拟服务器顺序依次请求。
- 最少连接——下一次请求会被分配到最少活跃连接数的虚拟服务器上。
- IP哈希——基于客户端的Ip地址进行哈希运算,该客户端的请求每次都会被分配到指定的虚拟服务器上。
- 加权——每个虚拟服务器会有一定占比,客户端的请求会依据占比被分配到虚拟服务器上。
配置Nginx负载均衡的关键是在HTTP配置块中添加upstream配置块,例:
http { upstream myapp1 { server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://myapp1; } } }
此例中,客户端的请求会按默认的负载均衡算法(即轮询)分配到srv1,srv2,srv3三台虚拟服务器上。
至于,如何配置不同的负载均衡算法,其实挺简单。例:
upstream myapp1 { # least_conn/ip_hash; server srv1.example.com weight=3; server srv2.example.com; server srv3.example.com; }
此例中,使用加权的方式。如果需要使用最少连接,或者Ip哈希的方式,只要在注释处配置即可。
更多负载均衡相关配置,请参考官方提供的文档《Using nginx as HTTP load balancer》。
高可用
现如今,云环境已经十分普及。要想实现高可用,Nginx必须克服自身的单点故障。据了解,目前较为成熟的方案是Nginx结Keepalived实现。其中,Keepalived只需安装,然后配置keepalived.conf即可。这并非本文重点,因此请读者自行查阅相关资料。
总结
千里之行,始于足下。
参考资料
- Nginx官方文档
- 尚硅谷Nginx教程
- Nginx程序
本文内容转自冰部落,仅供学习交流,版权归原作者所有,如涉及侵权,请联系删除。 声明: 本平台/个人所提供的关于股票的信息、分析和讨论,仅供投资者进行研究和参考之用。 我们不对任何股票进行明确的买入或卖出推荐。 投资者在做出投资决策时,应自行进行充分的研究和分析,并谨慎评估自己的风险承受能力和投资目标。 投资有风险,入市需谨慎。请投资者根据自身的判断和风险承受能力,自主决策,理性投资。