nginx常见问题及解决方案

https反向代理配置

● HTTPS 的固定端口号是 443,不同于 HTTP 的 80 端口
● SSL 标准需要引入安全证书,所以在 nginx.conf 中你需要指定证书和它对应的 key
其他和 http 反向代理基本一样,只是在 Server 部分配置有些不同

  #HTTP服务器
  server {
      #监听443端口。443为知名端口号,主要用于HTTPS协议
      listen       443 ssl;

      #定义使用www.xx.com访问
      server_name  www.helloworld.com;

      #ssl证书文件位置(常见证书文件格式为:crt/pem)
      ssl_certificate      cert.pem;
      #ssl证书key位置
      ssl_certificate_key  cert.key;

      #ssl配置参数(选择性配置)
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
      #数字签名,此处使用MD5
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

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

在这里插入图片描述

静态文件配置

有时候,我们需要配置静态文件(即 html 文件和一堆静态资源)

举例来说:如果所有的静态资源都放在了 /app/dist 目录下,我们只需要在 nginx.conf 中指定首页以及这个站点的 host 即可。

静态资源的配置不可以和动态访问路径写在一个location中

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    gzip on;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
    gzip_vary on;

    server {
        listen       80;
        server_name  localhost;
		#静态资源的配置不可以和动态访问路径写在一个location中
        location / {
            root /app/dist;
            index index.html;
            #转发任何请求到 index.html
        }
    }
}

在这里插入图片描述

服务获取客户端真实IP

当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取 r e m o t e a d d r ) , 取 得 的 是 n g i n x 的 地 址 , 即 remote_addr),取得的是nginx的地址,即 remoteaddrnginxremote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的,但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:

proxy_set_header            X-real-ip $remote_addr;
 proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:

#使用 这个可以直接获取到客户端ip
ipAddress =request.getHeader("X-real-ip")

或者使用这个:
ipAddress = request.getHeader("x-forwarded-for");

但是使用request.getHeader("x-forwarded-for");这个方法,需要进行分割,因为如果一个请求经过的多个代理,那么获取的ipAddress,就会是多个ip,第一个是客户端的真实ip,:
  // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
  				//"***.***.***.***".length()
            if (ipAddress != null && ipAddress.length() > 15) { 
                // = 15
                if (ipAddress.indexOf(",") > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }

详细参考配置

server {
 
        listen       88;
 
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
 
        location /{
 
            root   html;
 
            index  index.html index.htm;
 
                            proxy_pass                  http://backend; 
 
           proxy_redirect              off;
 
           proxy_set_header            Host $host;
 
           proxy_set_header            X-real-ip $remote_addr;
 
           proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
 

        }

跨域解决方案

跨域不是请求发不出去,而是服务端正常返回结果后被浏览器拦截返回结果。(浏览器为了防止非同源的请求 拿到服务器的返回数据结果)
web 领域开发中,经常采用前后端分离模式。这种模式下,前端和后端分别是独立的 web 应用程序,例如:后端是 Java 程序,前端是 React 或 Vue 应用

举例:www.helloworld.com 网站是由一个前端 app ,一个后端 app 组成的。前端端口号为 9000, 后端端口号为 8080。
前端和后端如果使用 http 进行交互时,请求会被拒绝,因为存在跨域问题。来看看,nginx 是怎么解决的吧:

首先,在 nginx/conf目录下创建enable-cors.conf 文件,然后设置 cors :

# allow origin list
set $ACAO '*';

# set single origin
if ($http_origin ~* (www.helloworld.com)$) {
  set $ACAO $http_origin;
}

if ($cors = "trueget") {
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

if ($request_method = 'OPTIONS') {
  set $cors "${cors}options";
}

if ($request_method = 'GET') {
  set $cors "${cors}get";
}

if ($request_method = 'POST') {
  set $cors "${cors}post";
}

在这里插入图片描述
然后再nginx.conf中进行引用:

# ----------------------------------------------------
# 此文件为项目 nginx 配置片段
# 可以直接在 nginx config 中 include(推荐)
# 或者 copy 到现有 nginx 中,自行配置
# www.helloworld.com 域名需配合 dns hosts 进行配置
# 其中,api 开启了 cors,需配合本目录下另一份配置文件
# ----------------------------------------------------
upstream front_server{
  server www.helloworld.com:9000;
}
upstream api_server{
  server www.helloworld.com:8080;
}

server {
  listen       80;
  server_name  www.helloworld.com;

  location ~ ^/api/ {
    include enable-cors.conf;
    proxy_pass http://api_server;
    rewrite "^/api/(.*)$" /$1 break;
  }

  location ~ ^/ {
    proxy_pass http://front_server;
  }
}

解决tomcat+nginx静态资源无法访问 问题

在使用Nginx实现Tomcat的负载均衡的时候,项目发布到了Tomcat,Nginx也配置好了,
当访问的时候发现了与预期不符
表现为:
静态资源加载失败
链接跳转地址错误
下面是我错误的配置文件

#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;


    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    
    upstream web{
        server localhost:8091;
    }
    

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /home/ftpuser;
        }

        #error_page  404              /404.html;
    }
    
    server {
        listen            808;
        server_name     localhost;
        
        location /{
            proxy_pass    http://web;
        }

    }

}

解决方案:
在Nginx的配置文件中nginx.conf里面配置server的地方加上如下配置
注意 proxy_pass 必须是 upstream的配置,不能是http://localhost:8091;

location ~ .* {
            proxy_pass     http://你的upstream配置的名称;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
        }

这是我的配置完正确的nginx配置文件供参考,

#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;
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
	
	upstream web{
		server localhost:8091;
	}
	
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;

        location / {
            root   /home/ftpuser;
        }
        #error_page  404              /404.html;
    }
	
	server {
		listen			808;
		server_name 	localhost;
		
		location /{
			proxy_pass	http://web/;
		}
		
		location ~ .* {
			proxy_pass 	http://web;
			proxy_set_header Host $http_host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Fonwarded-For $proxy_add_x_forwarded_for;
		}
	}
}

此时就可以了
在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于nginx配置与常见错误解决方法,我可以给您一些简单的介绍和建议。 首先,nginx作为一个开源的高性能Web服务器和反向代理服务器,其配置文件的语法非常简单,易于学习和使用。一般来说,nginx的配置文件主要包含以下几个部分: 1. 全局块:主要是一些全局参数的设置,比如worker_processes、pid、error_log等。 2. events块:主要是一些与事件相关的参数设置,比如worker_connections等。 3. http块:主要是配置http协议相关的参数,比如http服务器、虚拟主机、upstream负载均衡等。 4. server块:主要是配置http服务器相关的参数,比如监听端口、域名、SSL证书等。 当然,nginx的配置还可以包括一些额外的模块配置,比如gzip、fastcgi等等。 关于常见错误解决方法,以下是一些可能会遇到的问题和解决方法: 1. nginx启动失败:这个问题可能是由于配置文件语法错误、端口占用等原因导致的。解决方法可以通过查看日志、检查配置文件、查看端口占用情况等。 2. 403 Forbidden错误:这个错误通常是由于权限不足导致的。解决方法可以通过修改文件或目录的权限、检查SELinux等。 3. 404 Not Found错误:这个错误通常是由于资源不存在导致的。解决方法可以通过检查文件路径、检查文件权限、检查文件是否存在等。 4. 502 Bad Gateway错误:这个错误通常是由于后端服务器连接失败导致的。解决方法可以通过检查后端服务器是否正常运行、检查网络连接等。 总之,nginx作为一个高性能的Web服务器和反向代理服务器,其配置和错误处理都需要一定的经验和技巧,建议您多练习和学习,掌握一些常用的技巧和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值