Nginx配置详解
Nginx是一款轻量级的高性能的Web服务器和反向代理服务器,是由俄罗斯的程序设计师开发。 Nginx处理高并发能力十分强大,能经受高负载的考验。
Nginx特点
由于以下这几点,所以使用Nginx非常火,在互联网项目中广泛应用。
- 相较于 Apache具有占有内存少、稳定性高、并发能力强等优势;
- Nginx 使用基于事件驱动架构,使得其可以支持数以百万级别的 TCP 连接;
- 高度的模块化、扩展性好、和自由软件许可证、使得第三方模块层出不穷;
- Nginx是一个跨平台服务器,可以运行在 Linux、Windows、Mac OS 等操作系统上。
Nginx目录结构
在Linux中,Nginx默认站点目录通常位于/usr/share/nginx/html
 nginx的配置文件通常在/etc/nginx目录下,配置文件名称为nginx.conf。nginx.conf.default为nginx的默认配置文件,相当于一个初始文件的备份文件。
nginx的目录结构及作用如下
├── conf                             # Nginx所有配置文件的目录
│   ├── fastcgi.conf                 # fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default         # fastcgi.conf的原始备份文件
│   ├── fastcgi_params               # fastcgi的参数文件
│   ├── fastcgi_params.default       
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                   # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                   # Nginx主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                  # scgi相关参数文件
│   ├── scgi_params.default  
│   ├── uwsgi_params                 # uwsgi相关参数文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                     # fastcgi临时数据目录
├── html                             # Nginx默认站点目录
│   ├── 50x.html                     # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│   └── index.html                   # 默认的首页文件
├── logs                             # Nginx日志目录
│   ├── access.log                   # 访问日志文件
│   ├── error.log                    # 错误日志文件
│   └── nginx.pid                    # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp                       # 临时目录
├── sbin                             # Nginx命令目录
│   └── nginx                        # Nginx的启动命令
├── scgi_temp                        # 临时目录
└── uwsgi_temp                       # 临时目录Nginx配置文件结构
Nginx配置文件所在位置为:nginx/conf/nginx.conf。其配置文件的内容结构如下
main                    # 全局配置,对全局生效
├── events              # 配置影响 nginx 服务器或与用户的网络连接
├── http                # 可以嵌套多个 server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│   ├── upstream        # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│   ├── server          # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│   ├── server
│   │   ├── location    # server 块可以包含多个 location 块,location 指令用于匹配 uri
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...Nginx配置文件详解
# nginx进程数,建议设置为等于CPU总核心数。
worker_processes  1;
# 事件区块
events {
    # 每个worker进程的最大连接数。一般就保持默认,1024。
    worker_connections  1024;
}
# HTTP区块 设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    # Nginx支持的媒体类型库文件,默认为nginx.conf同一目录下的mime.types文件。
    include       mime.types;
    # 默认的媒体类型,一般默认即可。application/octet-stream指nginx以8进制数据流的方式将数据返回给浏览器。
    default_type  application/octet-stream;
    # 开启高效传输模式
    sendfile        on;
    # 长连接超时时间,单位是秒                              
    keepalive_timeout  65;
    # 第一个Server区块开始,表示一个独立的虚拟主机站点(可以配置多个server)
    server {
        # 提供服务的端口,默认80
        listen       80;
        # 提供服务的域名
        server_name  localhost;
        # 第一个location区块
        # 匹配以什么开头的URI,默认为/,表示匹配所有请求。如配置了/user,那么请求ip:端口/user/xx就会匹配到该路由。
        location / {
            # 指定服务的目录。填写相对路径时的默认根路径为/usr/share/nginx。
            root   html;
            # 指定当请求是一个目录时,应该返回哪个文件作为默认的首页文件,多个用空格分开
            index  index.html index.htm;
            # 指定请求转发到后端的路径。
            proxy_pass http://127.0.0.1:8089/test/;
        }
        # 出现对应的http状态码时,使用50x.html回应客户
        error_page   500 502 503 504  /50x.html;
        # location区块开始,访问50x.html
        location = /50x.html {
            # 指定对应的站点目录为html
            root   html;
        }
    }
}Nginx代理配置示例
强制http转https
server {
  listen 80;
  server_name test.com;
  # http强制跳转到https
  rewrite ^(.*)$ https://$server_name$1 permanent;
}前端history模式404问题
location / {
    try_files $uri $uri/ /index.html;
}root和alias两种配置静态资源的区别
server {
  listen 80;
  server_name localhost;
 
  # 用root方式,location中的路径会拼加到root的地址后面
  # 请求路径为:http://localhost:8080/files/index.jpg    实际访问为:/home/files/index.jpg
  location ~^/files/ {
    root /home/;
    index index.html index.htm;
  }
  # 用alias方式,location中的路径不会拼加到alias的地址后面
  # 这请求路径为:http://localhost:8080/files/index.jpg    实际访问为:/home/index.jpg
  location ~^/files/ {
    alias /home/;
    index index.html index.htm;
  }
}后台接口代理配置
server {
  listen 8080;
  server_name localhost;
 
#################### 第一种场景(代理地址不加斜杠) ####################
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/api/getUser
  location ^~/api/ {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $http_host;           # 后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr;    # 后台可以获取到用户访问的真实ip地址
  }
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际指向为:http://127.0.0.1:8000/api/getUser
  location ^~/api {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $http_host;           # 后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr;    # 后台可以获取到用户访问的真实ip地址
  }
 
#################### 第二种场景(代理地址+斜杠) ####################
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/getUser
  location ^~/api/ {
    proxy_pass http://127.0.0.1:8000/;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000//getUser
  location ^~/api {
    proxy_pass http://127.0.0.1:8000/;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
 
#################### 第三种场景(代理地址+后缀) ####################
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user/getUser
  location ^~/api {
    proxy_pass http://127.0.0.1:8000/user;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/usergetUser
  location ^~/api/ {
    proxy_pass http://127.0.0.1:8000/user;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
 
#################### 第四种场景(代理地址+后缀+斜杠) ####################
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user/getUser
  location ^~/api/ {
    proxy_pass http://127.0.0.1:8000/user/;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user//getUser
  location ^~/api {
    proxy_pass http://127.0.0.1:8000/user/;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
}