Nginx基本使用

182 阅读3分钟

部分配置模板

部分配置模板可在nginx.conf.default配置文件下

常用指令

  • ./nginx #启动nginx
  • nginx -s stop #停止nginx
  • nginx -s reload #重新加载配置文件
  • nginx -s quit #安全退出nginx

反向代理配置

代理通过listen,监听端口实现,所以配置反向代理时,需要注意端口是否被占用,如果需要查看端口,

linux中,netstat -ntulp | grep port,port是你需要查看的端口号

windows中,netstat -aon | findstr port,这里你会得到一些信息,我们需要最上面的即可

端口中80端口是配置http请求的,同时你的server_name需要的是一个域名或者ip

端口443端口是配置https请求的,同时需要配置ssl证书的密钥对,ssl证书可以到aliyun免费申请

server
{
  listen 443 ssl;
  server_name 域名;
  #配置ssl证书密钥对,这里需要你生成对应.crt和.key,并将其放到对应的目录下
  ssl_certificate C:\WebServer\Certs\certificate.crt; 
  ssl_certificate_key C:\WebServer\Certs\private.key;
  # 允许跨域请求的域,* 代表所有
  add_header 'Access-Control-Allow-Origin' *;
  #允许请求的header
  add_header 'Access-Control-Allow-Headers' *;
  #允许带上cookie请求
  add_header 'Access-Control-Allow-Credentials' 'true';
  #允许请求的方法,比如 GET,POST,PUT,DELETE
  add_header 'Access-Control-Allow-Methods' *;

#将所有HTTP请求通过rewrite指令重定向到HTTPS。
rewrite ^(.*)$ https://$host$1;

  location /
  {

  }

}

简单的反向代理配置

location /
{
	proxy_pass http:xxx:port
	autoindex on; # 开启浏览器浏览功能
}

location参数

location后面跟的参数

  • /表示的是项目根目录,即访问路径直接为服务器根地址
  • /xxx匹配请求url中的字符串,匹配成功,则进入location
  • 更多匹配规则见官网

root和alias

  • location配置的root的路径最终效果为:总路径=root路径+location路径+请求资源
  • location配置的alias的路劲最终效果为:总路径=alias路径+请求资源,相当于把location的路径拼接到原先的相应的root路径
  • locationroot会覆盖server中配置的root
  • alias的最后/不能省略,而root则可有可无

设置图片的映射

过滤所有的图片请求----当初被这个搞了好久,如果请求不了图片,记得把这段删除

location ~ .*\.(gif|jpg|jpeg|png)$ {             
expires 24h;             
root /data/www/images/;#指定图片存放路径,访问路径=>root+请求资源            
access_log /data/www/images/nginx/logs/images.log;#图片 日志路径             
proxy_store on;# 是否在本地磁盘缓存来自被代理服务器的响应数据,         
proxy_store_access user:rw group:rw all:rw;             
proxy_temp_path        /data/www/images/;#代理临时路径             
proxy_redirect          off;
proxy_set_header        Host 127.0.0.1;             
proxy_set_header        X-Real-IP $remote_addr;             
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;             
client_max_body_size    10m;             
client_body_buffer_size 1280k;             
proxy_connect_timeout  900;             
proxy_send_timeout      900;             
proxy_read_timeout      900;             
proxy_buffer_size      40k;             
proxy_buffers          40 320k;             
proxy_busy_buffers_size 640k;             
proxy_temp_file_write_size 640k;             
if ( !-e $request_filename)             
{                 
proxy_pass  http://127.0.0.1:8088;#代理访问地址             
}         
}

proxy_pass

请求代理设置,url可以是域名或者服务器地址,

下面举两个例子来表示两种情况 总的请求路径为http://www.tzfcw.top/images/1.jpg

例子1

location /images/
{
	proxy_pass http://127.0.0.1:8080/ # 这种带最后加斜线的,最后总的路径为代理地址加`images`后面的url片段 即 http://127.0.0.1:8080/1.jpg
}

例子2

location /images/
{
	proxy_pass http://127.0.0.1:8080 #像这样url后面不携带斜线的,最后总的url为 http://127.0.0.1:8080/images/1.jpg
}

负载均衡

upstream 是集群配置,后面跟的集群的名称,下面的是backend,在server块里添加location,

  • 每一个单点服务即server,后面都可以添加权重weight=xx,不添加的话,默认权值相同
  • backup定义的是备用服务器,
  • backup是指备份的意思,在Nginx的upstream中,backup参数是指将某个server标记为备用服务器。当所有非备用服务器都不可用时,请求将会被转发到备用服务器上
upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com weight=3;
        server 192.0.0.1 backup;
    }

    server {
        location / {
            proxy_pass http://backend;# 后面的url接集群的名称
        }
    }

配置跨域

预检验请求

http请求包括:简单请求和跨域请求

简单请求不会触发CORS预检验请求(options),

满足以下规范视为简单请求:

  • 使用下列方法之一

  • GET

  • POST

  • Content-type(仅当POST方法的content-type满足下列之一才视作简单请求)

    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded
  • HEAD

需要预检验的请求:

预检验请求首先会发送options请求,发送到服务端,来判断该请求是否可以跨域,可以避免跨域请求对服务器的用户数据产生未预期的影响。

满足下列条件视为需要预检验的请求

  • 使用了下面任一的HTTP方法

  • PUT

  • DELETE

  • CONNECT

  • OPTIONS

  • TRACE

  • PATCH

人为设置了对 CORS 安全的首部字段集合之外的其他首部字段。该集合为:

  • Accept

  • Accept-Language

  • Content-Language

  • Content-Type

  • DPR

  • Downlink

  • Save-Data

  • Viewport-Width

  • Width

Content-Type的值不属于下列之一:

  • application/x-www-form-urlencoded
  • multipart/form-data
    • text/plain
#允许跨域请求的域,* 代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET,POST,PUT,DELETE
add_header 'Access-Control-Allow-Methods' *;

# 拦截options请求,直接返回200状态码
if ($request_method = 'OPTIONS') {
                return 200;
  }

Access-Control-Allow-Methods *预检验未通过

假设你的前端页面是example.com,你想向http://api.com发送一…

  • Access-Control-Allow-Origin: example.com
  • Access-Control-Allow-Methods: POST
  • Access-Control-Allow-Headers: X-Custom-Header
  • Access-Control-Allow-Credentials: true

这样,浏览器在发送预检请求后,会收到服务器的允许,并继续发出实际的POST请求。如果你把Access-Control-Allow-Methods设置为*,那么浏览器会认为服务器不支持POST方法,而拒绝发送实际请求。

如果不携带cookie,那么Access-Control-Allow-Methods设置为*就可以允许任意方法的请求,因为*号会被当作通配符,而不是字面上的方法名。但是,这样做可能会有安全风险,因为你可能不想让任何来源的请求都能访问你的资源。所以,建议你还是指定具体的方法名,以增强安全性。

子配置文件

在nginx中有个主要的配置文件是nginx.conf,在nginx启动过程中会加载该配置文件,同时如果有子配置文件时会加载所有的子配置文件,子配置文件格式满足

=>*.conf,需以.conf结尾

同时配置文件内不需要http模块,即http模块不能出现在配置文件中

配置时容易出现的问题

502 bad gateway

前端报502 bad gateway的原因及解决方案_ruanhongbiao的博客-CSDN博客

  • 还有可能是你反向代理服务时,代理服务的协议出现错误,如本机的是http协议,代理服务却变成https协议