文章目录
-
nginx官网下载地址:https://nginx.org/en/download.html
-
下载稳定版本即可
-
下载压缩包解压到即可
- 进入文件夹中,打开命令行窗口,执行启动命令
bash
start nginx.exe
- 验证(默认是80端口)(出现欢迎页面即成功)
- 常用命令
bash
查看版本:nginx -v
验证nginx配置文件:nginx -t
启动: start nginx.exe
立即停止:nginx -s stop
重新加载:nginx -s reload
完整有序停止:nginx -s quit
配置信息详解
- nginx配置文件
bash
#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;
events {
worker_connections 1024;
}
http {
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 on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#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;
# }
#}
}
- 设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody
bash
#user nobody;
- worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行
bash
worker_processes 1;
- nginx 日志级别debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右越来越大
bash
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
-
设置nginx进程 pid
bash#pid logs/nginx.pid;
-
每个worker允许连接的客户端最大连接数
bashworker_connections 1024;
-
keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
bashkeepalive_timeout 65;
-
gzip
启用压缩,html/js/css压缩后传输会更快bashgzip on;
-
server模块
bash
listen 80; //监听端口
server_name localhost; //域名或ip
//请求路由映射,匹配拦截
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
正则表达式
bash
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如"ol*"能匹配"o"及"ol"、"oll"
+ :匹配前面的字符一次或多次。如"ol+"能匹配"ol"及"oll"、"olll",但不能匹配"o"
? :匹配前面的字符零次或一次,例如"do(es)?"能匹配"do"或者"does","?"等效于"{0,1}"
. :匹配除"\n"之外的任何单个字符,若要匹配包括"\n"在内的任意字符,请使用诸如"[.\n]"之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如"\n"匹配一个换行符,而"\$"则匹配"$"
\d :匹配纯数字[0-9] \s :空白符 \w :任意单词字符包括下划线[A-Za-z0-9_]
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符
bash
1:location 大致可以分为三类
精准匹配:location = / {...}
一般匹配:location / {...}
正则匹配:location ~ / {...}
2:location 常用的匹配规则
= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 正则匹配location。
~ :区分大小写的匹配。
~* :不区分大小写的匹配。
!~ :区分大小写的匹配取非。
!~* :不区分大小写的匹配取非。
3:location 优先级
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰符的一般前缀匹配
最后是交给 / 通用匹配
多个localhost优先级
- 精确匹配(
=
) > 前缀匹配(^~
)> 正则匹配(~
或~*
)> 常规路径前缀匹配 > 通配符匹配(/
)
bash
1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但后面前缀路径会和最长字符串优先匹配(最长匹配)
3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的前缀路径没有匹配到时,才会采用这一条
4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的前缀路径没有匹配到时,才会采用这一条
5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高
root和alias
root
是将 URI 直接追加到指定的目录路径后,而 alias
是替换掉匹配的 location 部分
- root
bash
location /image {
root html/;
index index.html index.htm;
}
访问:http://localhost/image/3.jpg 实际映射到 html/image/3.jpg
- alias
bash
location /image {
alias html/;
index index.html index.htm;
}
访问:http://localhost/image/3.jpg 实际映射到 html/3.jpg
注意: alias 后面必须要用 "/" 结束,否则会找不到文件,而 root 则对 "/" 可有可无。
配置访问后端接口
bash
location /api {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "";
proxy_http_version 1.1;
add_header Access-Control-Allow-Origin *;
proxy_pass http://127.0.0.1:15002/;
}
负载均衡
bash
# 代理服务器
upstream backend {
server localhost:8089;
server localhost:8088;
}
location /api {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "";
proxy_http_version 1.1;
add_header Access-Control-Allow-Origin *;
proxy_pass http://backend/;
}
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数(默认1次) |
fail_timeout | 经过max_fails次失败后,服务暂停的时间(默认10秒) |
max_conns | 限制最大的接收连接数(默认0 表示不限制) |
负载均衡策列
算法名称 | 说明 |
---|---|
轮询 | 默认方式 |
weight | 权重方式 |
ip_hash | 依据ip分配方式 |
least_conn | 依据最少连接方式 |
url_hash | 依据URL分配方式 |
fair | 依据响应时间方式 |
权重方式
权重数字越大,被分配到请求的几率越大
bash
upstream backend {
server localhost:8089 weight=10;
server localhost:8088 weight=1;
}
ip_hash
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某一个IP的用户在后端Web服务器A上登录后,再访问该站点的其他URL,能保证其访问的还是后端web服务器A
bash
upstream backend {
ip_hash;
server localhost:8089;
server localhost:8088;
}
least_conn
least_conn:最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均地转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
bash
upstream backend {
least_conn;
server localhost:8089;
server localhost:8088;
}
url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。
bash
upstream backend {
hash $request_uri;
server localhost:8089;
server localhost:8088;
}
try_files和index
例子一
bash
location /image {
root html/;
try_files $uri $uri/ /image/default.jpg;
}
比如 请求 127.0.0.1/image/test.jpg会依次查找
- 文件html/image/test.jpg
- 文件夹 html/images/test.jpg/下的index文件
- 请求127.0.0.1/image/default.jpg
例子二
这个配置适用于前端路由的单页应用程序。它尝试按顺序查找 $uri
和 $uri/
,如果都找不到,则返回 /index.html
,这样前端路由在浏览器刷新时也能正确处理。
bash
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
例子三
在这个配置中,如果静态文件查找失败(即 $uri
和 $uri/
都不存在),请求将被代理到一个后端服务器。
bash
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ @proxy;
}
location @proxy {
proxy_pass http://backend_server;
}
例子四
bash
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
gzip
bash
#开启gzip
gzip on;
#低于1kb的资源不压缩
gzip_min_length 1k;
#压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。
gzip_comp_level 5;
#需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_disable "MSIE [1-6]\.";
#是否添加"Vary: Accept-Encoding"响应头
gzip_vary on;
bash
http {
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
application/atom+xml
application/javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/bmp
image/svg+xml
image/x-icon
text/cache-manifest
text/css
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
}
gzip 是否开启gzip压缩 gzip on;
gzip_types 指定要压缩的MIME类型 gzip_types text/html text/plain application/javascript;
gzip_min_length 指定最小压缩文件大小 gzip_min_length 1000;
gzip_comp_level 指定压缩级别 范围为1到9,值越大压缩程度越大 gzip_comp_level 6;
gzip_buffers 指定用于gzip压缩的内存缓冲区大小 gzip_buffers 16 8k;
gzip_disable 指定不使用gzip压缩的User-Agent gzip_disable "MSIE [1-6].(?!.*SV1)";
gzip_proxied 根据客户端请求中的"Accept-Encoding"头部决定是否压缩响应,取值可以是 "off"、"expired"、"no-cache"、"no-store"、"private"、"no_last_modified"、"no_etag"、"auth" 或 "any" gzip_proxied any;
gzip_vary 如果发送的响应被gzip压缩,则在响应头部加上"Vary: Accept-Encoding",以通知缓存服务器响应内容可能以压缩或非压缩形式存在 gzip_vary:on;
gzip_http_version 设置进行gzip压缩的HTTP协议版本。 gzip_http_version:1.0
判断浏览器是否支持gzip
如果浏览器支持gzip
压缩,"Accept-Encoding
"字段中会包含"gzip
"或者"deflate
"等关键字
判断gzip是否生效
IP黑白名单
bash
include D:/tool/nginx/nginx-1.26.1/conf/include/blackIP.conf;
白名单文件
bash
# --------白名单:WhiteIP.conf---------
allow 192.168.1.70; # 允许192.168.1.70访问
allow 127.0.0.0/8; # 允许127.0.0.1到127.255.255.254网段中的所有IP访问
deny all; # 除开上述IP外,其他IP全部禁止访问
黑名单文件
bash
# --------黑名单:BlocksIP.conf---------
deny 192.168.1.48; # 屏蔽192.168.1.48访问
deny 127.0.0.0/8; # 屏蔽127.0.0.1到127.255.255.254网段中的所有IP访问
防盗链
bash
location ~* \.(gif|jpg|jpeg|png|bmp)$ {
valid_referers none blocked yourdomain.com example.com;
if ($invalid_referer) {
return 403;
#可以配置成返回一张禁止盗取的图片
#rewrite ^/ https://xxxxxxxxxxx
}
}
bash
+ 上述代码表示只有在`yourdomain.com`和`example.com`站点上才允许外链。如果来源不是这两个站点,则会返回403错误,无法直接访问。
+ `valid_referers`指令后面可以携带多个参数,表示多个`Referer`头都是有效的。主要参数有:
- `none`:如果header中的`Referer`为空,也能访问。
- `blocked`:header中的`Referer`不为空,但值被防火墙或代理服务器伪装过,比如不带http/https协议头的资源允许访问。
- `server_names`:若`Referer`中的站点域名和`server_names`中的某个域名匹配,则允许访问。
- 任意字符或者正则表达式:Nginx会通过查看`Referer`字段和`valid_referers`后面的`Referer`列表进行匹配,如果匹配到了就将内置的变量`$invalid_referer`设为真。
文件大小限制
bash
client_max_body_size 10m;
client_body_buffer_size 16k;
client_max_body_size
- 作用:用于限制客户端请求体(包括文件上传)的最大大小。
- 默认值:1m(1兆字节)。
- 配置方法 :可以在Nginx配置文件中的
http
、server
或location
块中进行设置
client_body_buffer_size
- 作用:用于设置接收客户端请求体的缓冲区大小。
- 默认值:16k(16千字节)。
- 配置方法 :同样可以在Nginx配置文件中的
http
、server
或location
块中进行设置
https配置
bash
# ----------HTTPS配置-----------
server {
# 监听HTTPS默认的443端口
listen 443;
# 配置自己项目的域名
server_name www.xxx.com;
# 打开SSL加密传输
ssl on;
# 配置自己下载的数字证书
ssl_certificate certificate/xxx.pem;
# 配置自己下载的服务器私钥
ssl_certificate_key certificate/xxx.key;
# 停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥
ssl_session_timeout 5m;
# TLS握手时,服务器采用的密码套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 服务器支持的TLS版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 开启由服务器决定采用的密码套件
ssl_prefer_server_ciphers on;
location / {
....
}
}