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地址
}
}