Skip to content

nginx


window 上运行命令

nginx.exe -s stop 或 nginx.exe -s quit

nginx.exe -s reload

linux 上运行 nginx 命令

systemctl start|stop|restart|status|reload nginx

Nginx 的参数包括:可以这样使用 /usr/local/nginx/sbin/nginx -参数

-c <path_to_config>:使用指定的配置文件而不是 conf 目录下的 nginx.conf 。

-t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误。

-v:显示 nginx 版本号。

-V:显示 nginx 的版本号以及编译环境信息以及编译时的参数。

root 指令

用于指定服务器文件的根目录,nginx 会将 location 后面的 uri 与 root 指令指定的路径拼接起来,作为最终的文件路径。

config
location /dist/ {
    root /usr/share/nginx/html;
}

root 是拼接 当请求/dist/static/css/style.css 时,nginx 会将其映射到/usr/share/nginx/html/dist/static/css/style.css 文件上。

alias 指令

用于指定服务器文件的别名,nginx 会将 location 后面的 uri 替换为 alias 指令指定的路径,作为最终的文件路径。

config
location /dist/ {
    alias /usr/share/nginx/html;
}

alias 是替换 当请求/dist/static/css/style.css 时,nginx 会将其映射到/usr/share/nginx/html/static/css/style.css 文件上。


location 路径映射讲解

= 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。

~ 表示执行一个正则匹配,区分大小写匹配

~* 表示执行一个正则匹配,不区分大小写匹配

!~ 区分大小写不匹配

!~* 不区分大小写不匹配

^~ 即表示只匹配普通字符(空格)。使用前缀匹配,^表示“非”,即不查询正则表达式。如果匹配成功,则不再匹配其他 location。

@ 指定一个命名的 location,一般只用于内部重定向请求。例如 error_page, try_files

uri 是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式;

优先级

[不加] < [~/~*] < [^~] < [=]

proxy_pass

配置 proxy_pass 代理转发时,如果在 proxy_pass 后面的 url 加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。 假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问。

第一种:

config
location /proxy/ {
    proxy_pass http://127.0.0.1/;
}

代理到 URL:http://127.0.0.1/test.html

第二种(相对于第一种,最后少一个 / )

config
location /proxy/ {
    proxy_pass http://127.0.0.1;
}

代理到 URL:http://127.0.0.1/proxy/test.html

第三种:

config
location /proxy/ {
    proxy_pass http://127.0.0.1/aaa/;
}

代理到 URL:http://127.0.0.1/aaa/test.html

第四种(相对于第三种,最后少一个 / )

config
location /proxy/ {
    proxy_pass http://127.0.0.1/aaa;
}

代理到 URL:http://127.0.0.1/aaatest.html

例子

config

#user  nobody; #指定的用户,如果不写,默认是nobody
worker_processes  1; #启动的worker进程数量。

#error_log  logs/error.log; #指定错误日志的存放路径,以及错误日志的级别。如果不写,默认是存储在 nginx安装路径/logs/error.log中。
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid; #存放master pid的文件,如果不写,默认在usr/local/nginx/logs下


events {
	# 指单个工作进程可以允许同时建立外部连接的数量,
	# 最大并发连接数:max_clients = worker_processes * worker_connections。但是这个最大连接数受操作系统的限制,进程最大可打开的文件数有关。https://blog.csdn.net/liupeifeng3514/article/details/79007079
    worker_connections  1024;
}


http {
	# 将另一个文件或符合指定掩码mime-type的文件纳入配置.mime.types包含types配置的MIME-type
    include       mime.types;
	# 定义响应的默认MIME类型。文件名扩展名与MIME类型的映射可以用types指令来设置。
	# 根据客户端的请求资源的后缀名进行判断(如:123.jpg),根据不同的值在mime.types中找到对应的MIME-type(如:image/jpeg  jpeg jpg;),并将MIME-type设置为响应头的content-type(如:image/jpeg),
	# 浏览器客户端根据响应头的content-type对返回的资源进行处理(是下载文件,还是渲染页面)。这里的default_type指的是在types中没有定义的类型,则使用默认类型,application/octet-stream表示下载文件
	# 资料:https://blog.csdn.net/wzj_110/article/details/112850811
    default_type  application/octet-stream;

	# 日志的存储格式。可以自己将日志输出格式组装成json字符串,方便解析日志使用
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
	# 日志的存储位置,如果不写,默认存储在nginx安装目录下的logs文件夹下
    #access_log  logs/access.log  main;

	# sendfile系统调用则提供了一种减少拷贝次数,提升文件传输性能的方法。
    sendfile        on;
    #tcp_nopush     on;

	# 参数指定了与客户端保持连接的超时。服务器将在这个时间之后关闭连接。
    keepalive_timeout  65;

	# 将响应报文发送至客户端之前开启压缩功能,这能够有效地节约带宽,并提高响应至客户端的速度,默认关闭。
	# 可以使网站的css、js 、xml、html文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能。但是对于图片、视频、大文件优化效果不明显,这几类不建议使用
	# 开启后需要同时开启gzip_types属性,才可以使压缩功能生效
	# 资料:https://www.cnblogs.com/kevingrace/p/10018914.html、https://blog.csdn.net/qq_59636442/article/details/124078426
    #gzip  on;
	#gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
	#gzip_min_length  20k;  #设置允许压缩的页面最小字节数; 这里表示如果文件小于10个字节,就不用压缩,因为没有意义,本来就很小.
    #gzip_buffers     4 16k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存
    #gzip_http_version 1.1; #压缩版本
    #gzip_comp_level 6; #设置压缩比率,最小为1,处理速度快,传输速度慢;9为最大压缩比,处理速度慢,传输速度快; 这里表示压缩级别,可以是0到9中的任一个,级别越高,压缩就越小,节省了带宽资源,但同时也消耗CPU资源,所以一般折中为6
    #gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
    #gzip_vary on;  #选择支持vary header;改选项可以让前端的缓存服务器缓存经过gzip压缩的页面; 这个可以不写,表示在传送数据时,给客户端说明我使用了gzip压缩



	# 虚拟服务器(一个nginx可以配置多个虚拟服务器,如果服务器ip对应多级域名,那么不同域名可以对应不同的虚拟服务器)
    server {
		# 监听的端口号
        listen       81;
		# 虚拟服务器名称。当开始处理一个http请求时,nginx会取出header中的host(host是浏览器请求地址中的域名或地址),与nginx.conf中的每一个server的server_name进行对比,
		# 然后根据server的匹配优先级排序,以此决定到底由哪一个server块来处理这个请求。当然选择一个server的前提是访问端口跟server中listen的端口对应。
		# 如果全部都不匹配,1.优先选择相同listen端口,后面标有default或default server的(如listen 80 default)。2.找到匹配listen端口的第一个server块。所以如果只有一个server,那么server_name作用不大
		# 参考文章:https://www.cnblogs.com/nextgg/p/16968961.html,https://blog.csdn.net/ThinPikachu/article/details/127326653
        # 端口号相同,server_name不同,根据不同的server_name进行判断进入哪个server。
		# 一个ip地址可以配置多个域名,那么就可以通过不同的域名对应不同的server_name,从而访问不同的地址;或者可以在hosts文件中把一个地址配置多个对应的域名进行测试
		server_name  localhost;

		# 设置解析文本使用的字符集。该模块将配置的编码添加到响应头"Content-Type"中(如:Content-Type: text/html; charset=utf-8)。该模块表示将一种编码的数据重新编码为另一种编码
        #charset utf-8;
		# 指定该server的访问日志,如果不写,默认是写到主日志中,logs/access.log中
        #access_log  logs/host.access.log  main;

		# location的格式可以包含:location [ = | ~ | ~* | ^~ ] uri { ... }
		# 如果使用正则表达式需要使用:~*(大小写不敏感)或者~(大小写敏感)
		#  location /testpath 等价于 location ^~ /testpath。
		# 优先级顺序:= > ^~ /path1/path2/ > ~*、~ (正则表达式按照顺序匹配,使用第一个匹配的 )> /path1/path2(常规匹配)
        location / {
			# 指定根目录
            root   html;
			# 默认的首页
            index  index.html index.htm;
        }

		# location优先级比较:中
		location ~* .(jpg|gif|jpeg)$ {
            root   html;
            index  index2.html;
        }
		# location优先级比较:高
        location ^~ /testpath/ {
            root   html;
            index  index.html;
            deny all;
        }
		# location优先级比较:低
		location  /testpath/ {
            root   html;
            index  index.html;
            # 对客户端地址的限制访问。这些规则被依次检查,直到找到第一个匹配项
			deny  192.168.1.1;
			allow 192.168.1.0/24;
			allow 10.1.1.0/16;
			allow 2001:0db8::/32;
			deny  all;
        }

		# root:起到追加路径的作用
		# 前缀匹配以/i/开头的uri,将最终全路径显示为:root的路径 + uri。如访问/i/111.png,则全路径为:/home/static_data/i/111.png
		#
		location /i/ {
            root /home/static_data;
        }

		# alias:起到路径替换作用
		# 前缀匹配以/i/开头的uri,并且将/i/替换为/home/static_data/,
		# 注意:如果匹配的是路径,那么/home/static_data/必须以'/'结尾,否则替换后的uri会少一层路径,导致404找不到文件
		location /i/ {
            alias /home/static_data/;
        }
		location /i/111.png {
            alias /home/static_data/222.png;
        }
		# ~ 表示使用正则表达式。
		# 使用正则表达式进行路径替换
		location ~ ^/users/(.+\.(?:gif|jpe?g|png))$ {
            alias /home/static_data/$1;
        }

		# $uri指的是匹配后的最终访问地址,$request_uri:指的是原始的访问地址
		# https://blog.csdn.net/gushaolin/article/details/103777154
		# try_files: file1 file2... uri。从file1开始依次匹配,找到第一个存在的文件返回,如果都不存在,则执行最后的uri进行跳转,最后的uri相当于内部redirect
		# 注意:file的开头必须有“/”,并且文件的全路径是:root + file1路径 (如:/usr/local/nginx/html + /111.png) ,root可以在location中定义,也可以在全局中定义。
		# 如果没有定义root,则默认root是/usr/local/nginx/html
		# $uri表示访问的文件,如果在配置的root目录下存在,并且是文件,则返回这个文件;$uri/表示访问的是$uri目录下的index.html文件
		# try_files: file1 file2... =code,同时可以将最后的uri替换为code,那么如果都不匹配,则返回给页面该code。(如:try_files $uri  $uri/  /index2.html  /python.jpg  /111.png =405;)
		location /images/ {
		   root /home/static_data/;
		   # 指访问:ip:81/images/,时的默认页面,index2.html的存放路径:root + /images/index2.html(既:/home/static_data/ + /images/index2.html)
		   index index2.html;
		   try_files $uri  $uri/  /index2.html  /python.jpg  /111.png /i/111.png;
        }

		location /ims/imsBack {
			# 如果proxy_pass后面的地址包含uri,那么与location匹配的部分将会被proxy_pass替换(/ims/imsBack会被/nginxtest/替换)
			#(如:浏览器请求:http://39.101.198.159:81/ims/imsBack/tt/getR,proxy_pass后:http://localhost:8080/nginxtest/tt/getR。)
			# 如果proxy_pass后面的地址不包含uri,那么将会将浏览器请求的uri追加到proxy_pass中。(如果proxy_pass是http://localhost:8080,则最终是:http://localhost:8080/ims/imsBack/tt/getR)
			# 注意:http://localhost:8080/ 最后如果有"/",也算是包含uri,这样就会将loaction的部分替换掉。 http://localhost:8080这样就不算包含uri
			# 所以浏览器: http://39.101.198.159:81/ims/imsBack/tt/getR,proxy_pass: http://localhost:8080/nginxtest/ 与 浏览器: http://39.101.198.159:81/nginxtest/tt/getR,proxy_pass: http://localhost:8080效果相同
			proxy_pass http://localhost:8080/nginxtest/;
			# proxy_set_header field value,允许重新定义或者添加发往后端服务器的请求头中
			# 设置请求的地址,如果不设置默认是代理服务器的地址。$proxy_host:代理服务器的地址和端口;$host:浏览器请求的ip(按以下顺序排列:来自请求行的主机名称,或来自 "Host "请求头字段的主机名称,或与请求匹配的服务器名称);$http_host 浏览器请求的ip+端口
			proxy_set_header Host $host;
			# X-Real-Ip指的是客户端真实IP字段,$remote_addr变量可以获取客户端地址
			proxy_set_header X-Real-Ip $remote_addr;
			proxy_set_header REMOTE-HOST $remote_addr;
			# X-Forwarded-For表示追加代理信息的,记录多级ip。是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

		}

    }

	# 端口号相同,server_name不同,根据不同的server_name进行判断进入哪个server。
	# 一个ip地址可以配置多个域名,那么就可以通过不同的域名对应不同的server_name,从而访问不同的地址;或者可以在hosts文件中把一个地址配置多个对应的域名进行测试
	server {
        listen       81;
        server_name  my_server.com;

        location / {
            root   html;
            index  index2.html index.htm;
        }
    }

}
config
server {
  # 项目启动端口
  listen            80;
  # 域名(localhost)
  server_name       _;
  # 禁止 iframe 嵌套
  add_header        X-Frame-Options SAMEORIGIN;

  # 访问地址 根路径配置
  location / {
    # 项目目录
    root 	    html;
    # 默认读取文件
    index           index.html;
    # 配置 history 模式的刷新空白
    try_files       $uri $uri/ /index.html;
  }

  # 后缀匹配,解决静态资源找不到问题
  location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root           html/static/;
  }

  # 图片防盗链
  location ~/static/.*\.(jpg|jpeg|png|gif|webp)$ {
    root              html;
    valid_referers    *.deeruby.com;
    if ($invalid_referer) {
      return          403;
    }
  }

  # 访问限制
  location /static {
    root               html;
    # allow 允许
    allow              39.xxx.xxx.xxx;
    # deny  拒绝
    deny               all;
  }
}

添加或修改 Gzip 配置

http {
    # ... 其他配置 ...

    # 启用 Gzip 压缩
    gzip on;

    # 设置压缩所需的最低 HTTP 请求版本(通常为 1.1)
    gzip_http_version 1.1;

    # 定义需要压缩的 MIME 类型(可以根据需要添加或删除类型)
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # 设置进行压缩的最小字节数(避免对小文件进行压缩) 单位是字节或k;
    gzip_min_length 256;

    # 设置压缩级别(1-9,数值越大压缩率越高,但也会消耗更多的 CPU 资源)
    gzip_comp_level 6;

    # 是否在 http header 中添加 Vary: Accept-Encoding(通常建议启用)
    gzip_vary on;

    # 对于来自代理的请求启用压缩(当 Nginx 作为反向代理时)
    gzip_proxied any;

    # 设置压缩所需要的缓冲区大小(以 16k 为单位)
    gzip_buffers 16 8k;

    # ... 其他配置 ...
}

Nginx 负载均衡的基本配置方法

http 块:定义全局 HTTP 设置。

upstream 块:定义一组后端服务器,Nginx 将根据负载均衡算法将请求分发到这些服务器。

server 块:配置具体的 HTTP 服务器,包括域名、端口和代理设置。

conf
http {
    upstream backend {
        server 192.168.1.1:80;
        server 192.168.1.2:80;
        server 192.168.1.3:80;
    }
    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

Nginx 提供了多种负载均衡算法,包括:

轮询(Round Robin):默认算法,按服务器顺序依次分发请求。

权重(Weight):根据服务器性能分配不同权重,权重高的服务器将处理更多请求。weight 值越大,服务器接收的请求就越多;weight 值越小,服务器接收的请求就越少。如果不设置 weight,Nginx 默认给每台服务器分配相同的权重(默认值为 1),也就是均匀分配请求。

IP 哈希(IP Hash):根据客户端 IP 地址进行哈希计算,确保同一客户端请求始终发送到同一服务器。

conf
#权重(Weight) 权重越高,分配到的请求比例越大。
upstream backend {
    server 192.168.1.1:80 weight=3;
    server 192.168.1.2:80 weight=2;
    server 192.168.1.3:80;
}
#IP 哈希(IP Hash)
upstream myapp {
    ip_hash;  # 使用 IP 哈希
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

Nginx 配置 SSL

conf

http {
    ...

    server {
        #SSL 默认访问端口号为 443
        listen 443 ssl;
        #请填写绑定证书的域名
        server_name example.com;

        ssl_certificate /path/to/example.com.crt;  # 证书文件路径
        ssl_certificate_key /path/to/example.com.key;  # 私钥文件路径

        # 如果有中间证书,也需要配置
        ssl_trusted_certificate /path/to/intermediate.crt;

        # 其他SSL配置参数
        ssl_protocols TLSv1.2 TLSv1.3;  # 支持的协议版本
        #TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
        #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;

        #ssl_ciphers HIGH:!aNULL:!MD5;  # 加密套件 写法遵循 openssl 标准。
        ssl_prefer_server_ciphers on;  # 优先使用服务器端的加密套件

        add_header Strict-Transport-Security "max-age=31536000";

        # 其他server配置...
    }

    ...
}

https://myssl.com/ 查看自身域名的评级

acme.sh --install-cert -d mseas.cn --fullchain-file /app/blog/html/ssl/mseas.cn.cer --key-file /app/blog/html/ssl/mseas.cn.key --reloadcmd "docker restart blog"