1. 安装
1.1 Windows环境
- 到官网下载
官网地址,选择下载稳定版本
- 无需安装解压即可使用
1.2 Linux环境
- 安装完毕后,nginx目录可以在/usr/local/nginx中找到
- 其中
- nginx启动 在 ./sbin中
- nginx.conf 在 ./conf中
2.常用命令
2.1 Windows环境
找到nginx的解压目录,在此目录下打开cmd
![](https://i0.hdslb.com/bfs/album/5460fc81781c39f8a19583d0bfde338fbf941962.png#crop=0&crop=0&crop=1&crop=1&id=Jm0r6&originHeight=280&originWidth=744&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
- 启动nginx
会一闪而过,这是正常滴
start nginx.exe
- 重新加载配置文件
nginx.exe -s reload
- 关闭nginx
nginx.exe -s stop # 二选一,均可
nginx.exe -s quit
2.2 Linux环境
nginx启动在 /usr/local/nginx/sbin 中
- 启动nginx
[root@aguozi sbin]# ./nginx
- 重新加载nginx.conf
[root@aguozi sbin]# ./nginx -s reload
- 关闭nginx
[root@aguozi sbin]# ./nginx -s stop
3.配置文件解释
文件名都是nginx.conf,不论系统都在安装目录下的/conf文件中
3.1 文件结构
- 全局块
- events块
- Http全局块
- Server全局块
- location块
- location块
- …
- Server全局块
- location块
- location块
- …
- …
- Server全局块
3.1.1 全局块
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
3.1.2 events块
# events块
events {
worker_connections 1024;
}
3.1.3 http块和子块
#http块
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# server块
server {
listen 80;
server_name localhost;
# location块
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 可以配置多个server块
}
3.2 配置详解
3.2.1 全局块配置
全局配置,nginx服务器整体运行的配置
常用 worker_processes 2; 设置进程数
# 配置⽤户或者组,默认为nobody nobody。
user www www;
#Nginx开启的worker进程数,建议为CPU的核数
worker_processes 2;
#指定nginx进程运⾏⽂件存放地址
pid /nginx/pid/nginx.pid;
#指定⽇志路径,级别。这个设置可以放⼊全局块、http块、server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
error_log log/error.log debug;
#可以在任意地⽅使⽤include指令实现配置⽂件的包含,类似于apache中的include⽅法,可减少主配置⽂件长度。
include vhosts/*.conf;
3.2.2 events事件配置
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接
events {
#设置⽹路连接序列化,防⽌惊群现象发⽣,默认为on
accept_mutex on;
#默认: 500ms 如果⼀个进程没有互斥锁,它将延迟⾄少多长时间。默认情况下,延迟是500ms 。
accept_mutex_delay 100ms;
#设置⼀个进程是否同时接受多个⽹络连接,默认为off
multi_accept on;
#事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport,不建议设置,nginx会⾃⾏选择
use epoll;
#最⼤连接数,默认为512
worker_connections 1024;
}
3.2.3 http部分
包括http全局块,以及多个server块。
http 全局块配置的指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
http {
#⽂件扩展名与⽂件类型映射表
include mime.types;
# 默认⽂件类型,默认为text/plain
default_type application/octet-stream;
#取消服务⽇志
#access_log off;
#允许sendfile⽅式传输⽂件,默认为off,可以在http块,server块,location块。
sendfile on;
#每个进程每次调⽤传输数量不能⼤于设定的值,默认为0,即不设上限。
sendfile_max_chunk 100k;
#连接超时时间,默认为75s,可以在http,server,location块。
keepalive_timeout 65;
#开启gzip资源压缩
gzip on;
#负载均衡
upstream blog {
server 192.167.20.19:8081;
server 192.168.10.121:8080 weight=5;
}
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#上传⽂件的⼤⼩限制默认1m
client_max_body_size 8m;
3.2.3.1 server
- 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
- 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机
- 而每个 server 块也分为
全局 server 块
,以及可以同时包含多个
location 块
。
server {
#单连接请求上限次数。
keepalive_requests 120;
#监听端⼝
listen 80;
#监听地址
server_name blog.13sai.com;
#设定⽇志格式
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 /data/logs/access.log main;
# 根⽬录
root /www/web/public;
# 定义错误提⽰页⾯
error_page 500 502 503 504 /50x.html;
常用:
listen 80; # 配置了这个,以下的server_name不生效server_name localhost;
server_name 可以设成服务器的IP地址,因为域名解析后有IP,所以可以设置成IP地址,先匹配IP后匹配域名
3.2.3.1.1 location块
- 一个 server 块可以配置多个 location 块。
主要作用是根据请求地址路径的匹配,匹配成功进行特定的处理
- 这块的主要作用是基于 Nginx 服务器接收到的请求字符串,对虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
location /static/ {
#root与alias主要区别在于nginx如何解释location后⾯的uri,这会使两者分别以不同的⽅式将请求映射到服务器⽂件上。
#root的处理结果是:root路径+location路径
#alias的处理结果是:使⽤alias路径替换location路径
alias /www/static/;
#过期30天,静态⽂件不怎么更新,过期可以设⼤⼀点,如果频繁更新,则可以设置得⼩⼀点。
expires 30d;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://blog; #请求转向blog 定义的服务器列表
}
location表达式
location [=|~|~*|^~] /uri/ { … }
- = 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
- ~ 区分大小写匹配(可用正则表达式)
- ~* 不区分大小写匹配(可用正则表达式)
- !~ 区分大小写不匹配
- !~* 不区分大小写不匹配
- ^~ 如果把这个前缀用于一个常规字符串,前缀匹配。不支持正则。
- 常规字符串匹配,多个符合则选最长的,如 location / { }
优先级
- 等号类型(=)的优先级最⾼。⼀旦匹配成功,则不再查找其他匹配项;
- 前缀普通匹配(^~)优先级次之。不⽀持正则表达式。使⽤前缀匹配,如果有多个location匹配的话,则使⽤表达式最长的那个;
- 正则表达式类型(~ ~*)的优先级次之。⼀旦匹配成功,则不再查找其他匹配项,也就是顺序匹配;
- 常规字符串匹配,如果有多个location匹配的话,则使⽤表达式最长的那个
路径映射问题
-
alias
不会拼接URL,(替换请求路径,从/blog开始),别名
location ^~ /blog/ {
alias /static/;
}
请求:[http://aguo.pro](http://aguo.pro) /blog/abc/2.jpg
实际:[http://aguo.pro](http://aguo.pro) /static/2.jpg
- root
拼接字符串,也就是会转为根路径
location ^~ /blog/ {
root /static/;
}
请求:[http://aguo.pro](http://aguo.pro) /blog/abc/2.jpg
实际:[http://aguo.pro](http://aguo.pro) /static/blog/abc/2.jpg
4.使用详解
4.1 代理模式
4.1.1 正向代理
客服端知道服务器实际IP
4.1.2 反向代理
隐藏服务器IP地址,服务器访问虚拟主机
4.1.3 应用案例
URL分发
,根据URL分发服务器
server {
listen 80;
# 进行路径匹配,匹配到edu代理到8081
location ~/a/ {
proxy_pass http://localhost:8081;
}
# 进行路径匹配,匹配到vod代理到8082
location ~/b/ {
proxy_pass http://localhost:8082;
}
}
访问
出现的结果均不同
4.2 负载均衡
简单来说就是使用分布式的场景,将原先的一台服务器做成一个集群,然后将请求分发到各个服务器上,分解压力,实现负载均衡。
4.2.1 配置文件
# 在http块中的全局块中配置
# upstream固定写法 后面的blog可以自定义
upstream blog{
server 192.168.80.100:8080;
server 192.168.80.100:8081;
}
# server配置
server {
# 监听80端口
listen 80;
#location块
location / {
# 反向代理到上面的两台服务器 写上自定义的名称
proxy_pass http://blog;
}
}
4.2.2 upstream中其他规则
- (默认)轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机会自动剔除。 - weight 权重
权重越高,该服务器收到的请求越多
upstream blog{
server 192.168.80.100:8080 weight=2;
server 192.168.80.100:8081 weight=1;
}
weight = 2,错误写法,不能有空格 否则报错
- ip_hash
通过哈希函数计算客户端的IP来选择服务器,保证session共享
upstream blog{
server 192.168.80.100:8080;
server 192.168.80.100:8081;
ip_hash;
}
- fair
自动根据服务器的响应速度来决定分配的权重
upstream blog{
server 192.168.80.100:8080;
server 192.168.80.100:8081;
fair;
}
4.3 动静分离
- 概述
- 将静态资源 css html js等和动态资源(请求)进行分开部署,
将静态资源直接部署在专门的服务器上,也可以直接放在反向代理服务器上(Nginx)所在在的服务器上
然后动态资源还是部署在服务器上,如tomcat。 - 然后请求来的时候,静态资源从专门的静态资源服务器获取,动态资源还是转发到后端服务器上。
- 将静态资源 css html js等和动态资源(请求)进行分开部署,
- 案例
说明:- localhost:8080 放静态文件
- localhost:8888 放动态文件
- nginx配置
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://localhost:8080; #解析其他项目
}
location ^~ /blog/static {
proxy_pass http://localhost:8080; #静态文件
}
location ~ /blog/static/index.html {
proxy_pass http://localhost:8080; # 首页静态文件
}
location ~ /blog {
proxy_pass http://localhost:8888; #处理后端java动态
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}