windows 安装 使用 nginx

文章目录

  • 进入文件夹中,打开命令行窗口,执行启动命令
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允许连接的客户端最大连接数

    bash 复制代码
    worker_connections 1024;
  • keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗

    bash 复制代码
    keepalive_timeout  65;
  • gzip启用压缩,html/js/css压缩后传输会更快

    bash 复制代码
    gzip 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配置文件中的httpserverlocation块中进行设置

client_body_buffer_size

  • 作用:用于设置接收客户端请求体的缓冲区大小。
  • 默认值:16k(16千字节)。
  • 配置方法 :同样可以在Nginx配置文件中的httpserverlocation块中进行设置

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 / {
        ....
    }
}
相关推荐
农村小镇哥4 小时前
nginx服务器的介绍
运维·服务器·nginx
llm大模型算法工程师weng12 小时前
负载均衡做什么?nginx是什么
运维·开发语言·nginx·负载均衡
fTiN CAPA13 小时前
服务器无故nginx异常关闭之kauditd0 kswapd0挖矿病毒 CPU占用200% 内存耗尽
运维·服务器·nginx
lKWO OMET15 小时前
查看 nginx 是否已经启动
运维·数据库·nginx
ywlovecjy17 小时前
【Nginx 】Nginx 部署前端 vue 项目
前端·vue.js·nginx
hutengyi18 小时前
四、nginx的优化和location匹配规则
运维·nginx
eEKI DAND19 小时前
一个比 Nginx 还简单的 Web 服务器
服务器·前端·nginx
Watermelo6171 天前
理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
前端·javascript·vue.js·chrome·nginx·正则表达式·seo
Cyber4K1 天前
【Nginx专项】高级进阶架构篇-Location、Rewrite及HTTPS
服务器·nginx·架构·https
博风1 天前
nginx:前后端分离常用配置
nginx