# Nginx学习笔记(二)-Nginx配置文件解读
[TOC]
Nginx的核⼼配置⽂件conf/nginx.conf包含三块内容:全局块、events块、http块
```yaml
#======start 全局块开始================
#user nobody;
#======启动的工作者线程数量是几个======
worker_processes 1;
#======错误日志及pid的文件位置,启动之后,nginx会生成一个文件名为端口号的文件===========
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#====end 全局快结束====================
#====events块start events块主要影响nginx服务器与用户的网络连接,比如worker_connections 1024,标识每个workderprocess⽀持的最大连接数为1024=======
events {
worker_connections 1024;
}
#====events块end=======
#====http块start http块是配置最频繁的部分,虚拟主机的配置,监听端口的配置,请求转发、反向代理、负载均衡等=======
http {
#==== 引入mime类型定义文件======
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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
#====设置连接超市时间====
keepalive_timeout 65;
#====是否开启gzip压缩====
#gzip on;
#====设置负载均衡====
upstream demoServer{
server 127.0.0.1:8084;
server 127.0.0.1:8086;
}
server {
#====需要监听的端口号===
listen 9003;
#====定义使用什么服务名访问===
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#====请求转发====
location / {
#=====根目录位置
root html;
#=====索引页
index index.html index.htm;
#==== 将请求转发到具体的地址,这里引用上面的负载均衡配置名,即可达到负载均衡的效果===
proxy_pass http://demoServer/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
#====错误提示页面====
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
```
- **全局块**:从配置⽂件开始到events块之间的内容,此处的配置影响nginx服务器整体的运⾏,⽐如worker进程的数量、错误⽇志的位置等
- **events块**:events块主要影响nginx服务器与⽤户的⽹络连接,⽐如worker_connections 1024,标识每个workderprocess⽀持的最⼤连接数为1024
- **http块**:http块是配置最频繁的部分,虚拟主机的配置,监听端⼝的配置,请求转发、反向代理、负载均衡等
## Nginx反向代理的配置

**需求一**:
1. 部署tomcat,保持默认监听8080端⼝
2. 修改nginx配置,并重新加载

3. 重新加载nginx配置
`./nginx -s reload`
4. 测试,访问http://111.229.248.243:9003,返回tomcat的⻚⾯

**需求二**:
1. 再部署⼀台tomcat,保持默认监听8081端⼝
2. 修改nginx配置,并重新加载

**Nginx下location有多种表达式,优先级默认按照下列顺序**
location的语法格式如下
```java
location [=|~|~*|^~] /uri/ { … }
```
1. 精确匹配 location **=** /abc{ }
2. 匹配路径的前缀 location **^~** /abc{ }
3. 不区分大小写的正则匹配 location **~*** /abc{ }
4. 正则匹配 location **~** /abc{ }
5. 普通路径前缀匹配 location /abc{ }
## Nginx的负载均衡策略与配置

Nginx的负载均衡策略默认有多种,轮询,权重,ip_hash,最快响应时间(fair),URL 绑定(url_hash),最小连接数(least_conn)
- **轮询**:
- 默认情况下 Nginx 服务器实现负载均衡的算法就是轮询,轮询策略按照顺序选择组内服务器处理请求。如果一个服务器在处理请求的过程中出现错误,请求会被顺次交给组内的下一个服务器进行处理,以此类推,直到返回正常的响应为止。但如果所有的组内服务器都出错,则返回最后一个服务器的处理结果。
- ```yaml
upstream lagouServer{
server 111.229.248.243:8080;
server 111.229.248.243:8082;
}
location /abc {
proxy_pass http://lagouServer/;
}
```
- **weight**:
- 组内服务器设置权重,权重值高的服务器被优先用于处理请求。此时组内服务器的选择策略为加权轮询。组内所有服务器的权重默认设置为 1,即采用轮询处理请求。
```yaml
upstream lagouServer{
server 111.229.248.243:8080 weight=1;
server 111.229.248.243:8082 weight=2;
}
```
- **ip_hash**:
- ip_hash 用于实现会话保持功能,将某个客户端的多次请求定向到组内同一台服务器上,保证客户端与服务器之间建立稳定的会话。只有当服务器处于无效(down)的状态时,客户端请求才会被下一个服务器接收和处理。注意:使用 ip_hash 后不能使用 weight,ip_hash 和主要根据客户端 IP 地址分配服务器,因此在整个系统中,Nginx 服务器应该是处于最前端的服务器,这样才可以获取到客户端 IP 地址,否则它得到的 IP 地址将是位于它前面的服务器地址,从而就会产生问题。
```yaml
upstream lagouServer{
ip_hash;
server 111.229.248.243:8080;
server 111.229.248.243:8082;
}
```
- **最快响应时间(fair)**:
- 智能调度算法,动态地根据后端服务器的处理处理效率和响应时间对请求进行均衡分配,响应时间短、处理效率高的服务器分配到请求的概率高,响应时间长、处理效率低的服务器分配到请求的概率低。使用这种算法需要安装 upstream_fair 模块。
- **URL 绑定(url_hash)**:
- 按照访问的 URL 的 hash 结果分配请求,相同的 URL 会访问同一个后端服务器,在一定程度上可以提高缓存的效率。使用这种算法需要安装 Nginx 的 hash软件包。
- **最小连接数(least_conn)**:
- least_conn 用于为网络连接分配服务器组内的服务器,在功能上实现了最小连接数负载均衡算法,在选择组内的服务器时,考虑各服务器权重的同时,每次选择的都是当前网络连接最少的那台服务器,如果这样的服务器有多台,就采用加权轮询选择权重值大的服务器。
## Nginx动静分离的配置

**nginx将静态文件的请求拦截并将其转发到静态文件的目录下加载**

Nginx学习笔记(二)-Nginx配置文件解读