【JAVA WEB实用技巧与优化方案】Nginx常用命令总结及常见问题排查总结

【JAVA WEB实用技巧与优化方案】Nginx常用命令总结及常见问题排查总结

码农世界 2024-06-05 前端 79 次浏览 0个评论

目录

  • 常用启停命令
  • Nginx 常见问题
    • Nginx 如何忽略非标准http头检测?
    • Nginx websocket代理
    • Nginx 临时缓存不够导致下载文件失败
    • Nginx 没有临时缓存目录权限导致下载文件失败
    • Nginx非root用户启动无法使用80端口或者报无权限异常
    • 路由重写怎么配置?
    • nginx 根据ip hash负载怎么配置?
    • Nginx 日志输出怎么配置?
    • Nginx 如何替换Html插入变量?
    • Nginx 前端配置
      • vue hash模式配置
      • vue history模式配置
      • nginx gzip配置
        • gzip 动态压缩
        • gzip 静态压缩
        • 附录
          • try_files

            常用启停命令

            注意nginx不同的环境安装目录可能会有所不同,请找到对应的nginx安装目录替换/usr/local/nginx/sbin

            # 进入到nginx可执行文件目录(未使用systemctl来管理nginx情况下)
            cd /usr/local/nginx/sbin
            # 重启
            ./nginx -s restart
            # 只重新load配置
            ./nginx -s reload
            # 启动
            ./nginx
            # 停止
            ./nginx -s stop
            # 查看nginx配置文件路径和版本
            nginx -t
            # 查看nginx版本
            nginx -v
            # 查看nginx运行状态(使用systemctl管理nginx的情况下才能使用)
            systemctl status nginx
            systemctl restart nginx
            systemctl reload nginx
            systemctl stop nginx
            systemctl start nginx
            # 查看nginx端口状态
            netstat -tuln | grep nginx
            # 查看nginx访问或错误日志
            tail -f /path/to/nginx/logs/acccess[error].log
            # 备份nginx日志
            cp /usr/local/nginx/nginx.conf /user/local/nginx/nginx.conf.bak.1
            

            Nginx 常见问题

            Nginx 如何忽略非标准http头检测?

            在Nginx中,默认情况下,它会拒绝包含非标准HTTP头的请求。这是出于安全考虑,以防止可能的HTTP请求头注入攻击。如果你确实需要允许非标准HTTP头,则可以通过设置underscores_in_headers指令来实现。

            以下是如何在Nginx配置中忽略非标准HTTP头检测:

            http {
                ...
                underscores_in_headers on;
                ...
            }
            

            将 underscores_in_headers 设置为 on 会允许Nginx接受请求中带有下划线的非标准HTTP头。请注意,启用此选项可能会导致一些安全风险,因为允许非标准HTTP头可能会增加潜在的安全漏洞。因此,只有在你确信需要允许非标准HTTP头并且能够确保安全性的情况下才应该使用这个选项。

            在设置underscores_in_headers时,请确保遵循安全最佳实践,并且仔细评估潜在的安全风险。

            Nginx websocket代理

            要在Nginx中配置WebSocket代理,你需要使用proxy_pass指令,并且启用WebSocket协议。以下是一个示例配置:

            server {
                listen 80;
                server_name your_domain.com;
                location /websocket {
                    proxy_pass http://backend_server;
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                }
            }
            

            解释:

            • location /websocket指定了WebSocket的路径,即所有访问 /websocket 的请求都将被代理。
            • proxy_pass http://backend_server;指定了后端WebSocket服务器的地址。
            • proxy_http_version 1.1;指定了使用HTTP 1.1协议,这是WebSocket所需的。
            • proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade";这两行指定了将请求升级为WebSocket协议,以便Nginx正确处理WebSocket连接。

              确保替换 your_domain.com 为你的域名,并将 http://backend_server 替换为你的后端WebSocket服务器地址。

              配置完成后,重新加载Nginx以使更改生效:

              sudo systemctl reload nginx 或 nginx -s reload
              

              这样配置后,所有访问 /websocket 的请求将被代理到后端WebSocket服务器,并且WebSocket连接将能够正常工作。

              注意:如果nginx -s reload配置不能生效则需要手动重启nginx,先杀掉nginx,然后再启动nginx。

              Nginx 临时缓存不够导致下载文件失败

              proxy_buffer_size是用于设置Nginx代理缓冲区的大小的指令。它指定了用于存储从上游服务器接收到的响应数据的缓冲区的大小。如果响应数据的大小超过了这个值,Nginx将使用磁盘缓存或向客户端发送数据,这取决于proxy_buffering指令的设置。

              默认情况下,proxy_buffer_size的值是与操作系统相关的,默认大小是4k或8k。你可以在Nginx配置中根据需要显式设置这个值,以便更好地适应你的场景。

              下面是一个示例配置:

              http {
                  ...
                  proxy_buffer_size 16k;
                  ...
              }
              

              在这个示例中,proxy_buffer_size被设置为16k,这意味着Nginx将使用16k大小的缓冲区来存储从上游服务器接收到的响应数据。

              要注意的是,如果你设置了proxy_buffering off;禁用了代理缓冲,proxy_buffer_size指令将被忽略,而Nginx将立即将从上游服务器接收到的响应数据发送给客户端。

              确保根据你的实际需求和系统资源来调整proxy_buffer_size的大小,避免设置过大或过小的值。

              Nginx 没有临时缓存目录权限导致下载文件失败

              cd /ucenter/soft/nginx/sbin
              chown root nginx
              chmod u+s nginx
              

              Nginx非root用户启动无法使用80端口或者报无权限异常

              cd /ucenter/soft/nginx/sbin
              chown root nginx
              chmod u+s nginx
              

              因为linux 80端口的使用必须要拥有root权限,上述处理方法是让nginx临时拥有超越普通用户的权限晋升到root权限,这样80端口就可以正常使用了。

              路由重写怎么配置?

              将/xxx/abc/123请求重写为/xxx/123并代理到http://localhost:8080,你可以使用rewrite指令结合proxy_pass指令。以下是一个示例配置:

              server {
                  listen 80;
                  server_name your_domain.com;
                  location /xxx/ {
                      # 处理 /xxx/abc/123 请求,将其重写成 /xxx/123 并代理到 http://localhost:8080
                      rewrite ^/xxx/abc/(.*)$ /xxx/$1 break;
                      proxy_pass http://localhost:8080;
                  }
                  # 其他配置...
              }
              

              nginx 根据ip hash负载怎么配置?

              http {
                  upstream backend {
                      ip_hash;
                      server backend1.example.com;
                      server backend2.example.com;
                      server backend3.example.com;
                  }
                  server {
                      listen 80;
                      server_name your_domain.com;
                      location / {
                          proxy_pass http://backend;
                      }
                  }
              }
              

              Nginx 日志输出怎么配置?

              http {
                  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                        '$status $body_bytes_sent "$http_referer" '
                                        '"$http_user_agent" "$http_x_forwarded_for" "$http_cookie"';
                  log_format  sendfile  '$remote_addr - $remote_user [$time_local] "$request" '
                                    '$status $body_bytes_sent "$http_referer" '
                                    '"$http_user_agent" "$http_x_forwarded_for" "$http_cookie"';
                                    
                  access_log logs/access.log main; # 指定格式
                  error_log logs/error.log;
              }
              

              http header 中的内容可以通过$http_xxx来输出,比如user-agent可以写成$http_user_agent,cookie 可以写成$http_cookie

              Nginx 如何替换Html插入变量?

              server {
                  listen 8090;
                  server_name localhost;
                  location / {
                      index index.html;
                      root /Users/yueyu/Project/allens-learn/webapp/subfilter;
                      # 启用 sub_filter
                      sub_filter '_SERVER_ADDR' 'http://123.com';
                      sub_filter_once off; # 可选,用于启用全局替换而不仅仅是第一次出现的地方
                  }
              }
              

              Nginx 前端配置

              vue hash模式配置

              server {
                  listen 8090;
                  server_name localhost;
                  location / {
                      index index.html index.htm;
                      root /webapp/app;
                  }
                  
                  location ~ /api {
                      proxy_pass http://localhost:8080;
                      proxy_set_header X-Real-IP $remote_addr;
                      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                      proxy_set_header Host $host;
                      # 可选:设置其他代理头部
                      # proxy_set_header X-Forwarded-Proto $scheme;
                  }
              }
              

              vue history模式配置

              server {
                  listen 8090;
                  server_name localhost;
                  
                  root /webapp/app;
                  
                  location ~ /api/ {
                      proxy_set_header Host $host;
                      proxy_set_header X0Real-IP $remote_addr;
                      proxy_pass http://localhost:8080;
                  }
                  
                  location / {
                      try_files $uri $uri/ /index.html;
                      index index.html index.htm;
                  }
              }
              

              nginx gzip配置

              动态压缩和静态压缩都是用于减少HTTP响应大小,从而提高网站性能和降低带宽消耗的技术。

              gzip 动态压缩

              优点:

              • 适用于动态生成的内容,如通过PHP、Python或其他服务器端脚本生成的页面。
              • 可以根据请求的头信息(如Accept-Encoding)动态选择压缩算法和压缩级别。
              • 对于动态内容,可以在压缩时进行更精确的控制和优化。

                缺点:

                • 对CPU资源消耗较高,特别是在高负载下可能会影响服务器性能。
                • 每次请求都需要进行压缩,可能会增加服务器负载。
                • 不适用于已经被缓存的内容,因为内容每次请求都可能是动态生成的,无法从缓存中提供。
                  http {
                      # 开启和关闭gzip模式
                      gzip on;
                      # gizp压缩起点,文件大于1k才进行压缩
                      gzip_min_length 1k;
                      # 设置压缩所需要的缓冲区大小,以4k为单位,如果文件为7k则申请2*4k的缓冲区 
                      gzip_buffers 4 16k;
                      # 设置gzip压缩针对的HTTP协议版本
                      gzip_http_version 1.0;
                      # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
                      gzip_comp_level 2;
                      # 进行压缩的文件类型
                      gzip_types text/plain application/javascript text/css application/xml;
                      # 是否在http header中添加Vary: Accept-Encoding,建议开启
                      gzip_vary on;
                  }
                  

                  gzip 静态压缩

                  优点:

                  • 适用于静态文件,如CSS、JavaScript、图像等,这些文件的内容不会随着每次请求而改变。
                  • 一次压缩,多次受益:静态文件通常只需要在首次请求时进行压缩,之后可以直接提供已经压缩过的文件,无需重复压缩。
                  • 减少服务器负载:静态文件只需要在生成或修改时进行一次压缩,不会像动态内容那样每次请求都需要进行压缩处理。

                    缺点:

                    • 不适用于动态生成的内容,因为它们无法被预先压缩。
                    • 对于一些大型的静态文件,如图像和视频,压缩可能不会带来显著的性能提升。
                    • 对于频繁更新的静态文件,需要确保每次更新都能及时进行压缩,否则可能会影响网站性能。

                      nginx 静态压缩需要使用 ngx_http_gzip_static_module 模块,先简单看一下介绍:

                      ngx_http_gzip_static_module 模块允许发送扩展名为 .gz 的预压缩文件,而不是常规文件。

                      默认情况下未构建此模块,应使用 --with-http_gzip_static_module 配置参数启用它 。

                      在安装包目录编译安装:

                      ./configure --with-http_gzip_static_module
                      

                      例如 Nginx 安装配置 安装 Nginx 第4步编译安装,在第一步./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35 之后加上 --with-http_gzip_static_module。

                      --prefix 跟的是你nginx的安装的目录

                      gzip_static  on;
                      gzip_proxied expired no-cache no-store private auth;
                      

                      动静结合配置:

                      http {
                          gzip_static  on;
                          gzip_proxied expired no-cache no-store private auth;
                          gzip on; 
                          gzip_min_length 1k;
                          gzip_buffers 4 16k;
                          gzip_http_version 1.0;
                          gzip_comp_level 2;
                          gzip_types text/plain application/javascript text/css application/xml;
                          gzip_vary on;
                      }
                      

                      附录

                      try_files

                      try_files 是nginx中一个非常有用的指令,它用于尝试寻找指定的文件或目录,并将请求重新定向到找到的第一个文件或目录。通常用于处理URL重写和错误页面等情况。

                      try_files file ... uri;
                      

                      其中:

                      file … 是要尝试的文件或目录列表。

                      uri 是当所有文件或目录都不存在时,将请求重定向到的URI。

转载请注明来自码农世界,本文标题:《【JAVA WEB实用技巧与优化方案】Nginx常用命令总结及常见问题排查总结》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,79人围观)参与讨论

还没有评论,来说两句吧...

Top