Appearance
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"