欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Linux 安装和部署服务:nginx和Openresty - IV,nginx常用配置

最编程 2024-10-19 07:22:45
...

4.1 nginx 基础配置

  • nginx 代理的简单配置

    server {
    	listen       80;
    	server_name  localhost;
    	location / {
    		root   /usr/local/web/dist;
    		index  index.html index.htm;
    		# 如果配置的是history路由需开启此项
    		# try_files $uri $uri/ /index.html;
    	}
    	# 静态资源目录,在对应目录先建好文件夹
    	location /admintest {
    		alias   /usr/local/web/admin/dist;
    		index  index.html index.htm;
    	}
    	#代理node服务
    	location /api {
    		proxy_pass http://127.0.0.1:3002;
    	}
    }
    
  • 配置说明:root 指令 和 alias 指令

    1. root指令:用于指定服务器文件的根目录,nginx会将location后面的uri与root指令指定的路径拼接起来,作为最终的文件路径。
    2. alias指令:用于指定服务器文件的别名,nginx会将location后面的uri替换为alias指令指定的路径,作为最终的文件路径。
    # nginx配置示例: 
    location /dist/ {
    	root /opt/nginx/html;
    	index index.html index.htm;
    	try_files $uri $uri/ /index.html;
    }
    
    # root是拼接: 当请求/dist/static/css/style.css时, nginx会将其映射到/opt/nginx/html/dist/static/css/style.css文件上
    # alias是替换: 当请求/dist/static/css/style.css时, nginx会将其映射到/opt/nginx/html/static/css/style.css文件上
    

4.2 nginx 重定向

  • nginx 重定向配置

    # if按照格式书写,括号前后的空格必须带着
    server {
    	listen 80;
    	# listen 443;
    	server_name www.xxx.com xxx.com;
    	if ($host != 'www.xxx.com') {
    		rewrite ^/(.*)$ http://www.xxx.com/$1 permanent;
    	}
    }
    
    server {
    	server_name  xxx.com;
    	rewrite ^(.*)$ http://www.xxx.com$1 permanent;
    }
    
    # (提前配置好SSL证书)
    server {
    	listen 80;
    	server_name www.xxx.com xxx.com;
    	rewrite ^(.*)$ https://$host$1;
    }
    

4.3 nginx 跨域访问

  • nginx 跨域访问配置

    location / {  
    	# 允许跨域的请求,可以自定义变量$http_origin,*表示所有  
    	add_header 'Access-Control-Allow-Origin' *;  
    	# 允许携带cookie请求  
    	add_header 'Access-Control-Allow-Credentials' 'true';  
    	# 允许跨域请求的方法:GET,POST,OPTIONS,PUT  
    	add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';  
    	# 允许请求时携带的头部信息,*表示所有  
    	add_header 'Access-Control-Allow-Headers' *;  
    	# 允许发送按段获取资源的请求  
    	add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';  
    	# 一定要有!!!否则Post请求无法进行跨域!  
    	# 在发送Post跨域请求前,会以Options方式发送预检请求,服务器接受时才会正式请求  
    	if ($request_method = 'OPTIONS') {  
    		add_header 'Access-Control-Max-Age' 1728000;  
    		add_header 'Content-Type' 'text/plain; charset=utf-8';  
    		add_header 'Content-Length' 0;  
    		# 对于Options方式的请求返回204,表示接受跨域请求  
    		return 204;  
    	}  
    } 
    

4.4 nginx 防盗链

  • nginx 静态资源防盗链配置

    # 配置基础语法 
    valid_referers none | blocked | server_names | string ...;
    1. none:表示接受没有Referer字段的HTTP请求访问
    2. blocked:表示允许http://或https//以外的请求访问
    3. server_names:资源的白名单,这里可以指定允许访问的域名
    4. string:可自定义字符串,支配通配符、正则表达式写法
    
    # 在动静分离的location中开启防盗链机制  
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){  
    	# 最后面的值在上线前可配置为允许的域名地址  
    	valid_referers blocked 192.168.12.129;  
    	if ($invalid_referer) {  
    		# 可以配置成返回一张禁止盗取的图片  
    		# rewrite   ^/ http://xx.xx.com/NO.jpg;  
    		# 也可直接返回403  
    		return   403;  
    	}  
    
    	root   /soft/nginx/static_resources;  
    	expires 7d;  
    }  
    

    说明: nginx 也有防盗链的相关模块 ngx_http_accesskey_module

4.5 nginx 证书配置

  • nginx 配置 ssl 证书 及相关 https 的配置

    # ----------HTTPS配置-----------  
    server {  
    	# 监听HTTPS默认的443端口  
    	listen 443;  
    	# 配置自己项目的域名  
    	server_name www.xxx.com;  
    	# 打开SSL加密传输  
    	ssl on;  
    	# 输入域名后,首页文件所在的目录  
    	root html;  
    	# 配置首页的文件名  
    	index index.html index.htm index.jsp index.ftl;  
    	# 配置自己下载的数字证书  
    	ssl_certificate  certificate/xxx.pem;  
    	# 配置自己下载的服务器私钥  
    	ssl_certificate_key certificate/xxx.key;  
    	ssl_session_cache    shared:SSL:1m;
    	# 停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥  
    	ssl_session_timeout 5m;  
    	# TLS握手时,服务器采用的密码套件  
    	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  
    	# 服务器支持的TLS版本  
    	ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;  
    	# 开启由服务器决定采用的密码套件  
    	ssl_prefer_server_ciphers on;  
    
    	location / {  
    		....  
    	}  
    }  
    
    # ---------HTTP请求转HTTPS-------------  
    server {  
    	# 监听HTTP默认的80端口  
    	listen 80;  
    	# 如果80端口出现访问该域名的请求  
    	server_name www.xxx.com;  
    	# 将请求改写为HTTPS(这里写你配置了HTTPS的域名)  
    	rewrite ^(.*)$ https://www.xxx.com;  
    }  
    

4.6 nginx 动静分离

  • nginx 配置动静分离

    # 在项目上线部署时,这些静态资源会img|html|js|css...一起打成包
    # 那这对于后端服务器的压力是尤为巨大的
    
    # 1. 先在部署Nginx的机器,Nginx目录下创建一个目录static_resources
    mkdir static_resources  
    
    # 2. 将项目中所有的静态资源全部拷贝到该目录下,而后将项目中的静态资源移除重新打包
    
    # 3. 修改一下nginx.conf的配置,增加一条location匹配规则
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){  
    	root   /soft/nginx/static_resources;  
    	expires 7d;  
    }  
    
    # 也可以将静态资源上传到文件服务器中,然后location中配置upstream指向
    

4.7 nginx 资源压缩

  • nginx 资源压缩配置

    # 在Nginx也提供了三个支持资源压缩的模块
    ngx_http_gzip_module
    ngx_http_gzip_static_module
    ngx_http_gunzip_module
    
    # 相关配置如下
    http{
        # 开启压缩机制
        gzip on;
        # 指定会被压缩的文件类型(也可自己配置其他类型)
        gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
        # 设置压缩级别,越高资源消耗越大,但压缩效果越好
        gzip_comp_level 5;
        # 在头部中添加Vary: Accept-Encoding(建议开启)
        gzip_vary on;
        # 处理压缩请求的缓冲区数量和大小
        gzip_buffers 16 8k;
        # 对于不支持压缩功能的客户端请求不开启压缩机制
        gzip_disable "MSIE [1-6]\."; # 低版本的IE浏览器不支持压缩
        # 设置压缩响应所支持的HTTP最低版本
        gzip_http_version 1.1;
        # 设置触发压缩的最小阈值
        gzip_min_length 2k;
        # 关闭对后端服务器的响应结果进行压缩
        gzip_proxied off;
    }
    

4.8 nginx 负载均衡

  • nginx 反向代理-负载均衡

    upstream myserver{  
       # 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2  
       server xxx:8080 weight=100 max_fails=2 fail_timeout=30s;   
       server xxx:8090 weight=200 max_fails=2 fail_timeout=30s;  
       # 这里的IP请配置成你WEB服务所在的机器IP  
    }  
      
    server {  
        location / {  
            root   html;
            index  index.html index.htm index.ftl;  
            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_boot的upstream上  
            proxy_pass http://myserver;  
        }  
    }  
    

4.9 nginx 代理访问

  • 场景说明: 在某些政务单位或机构,内部使用的是局域网即所谓的内网环境,无法直接访问外网即互联网环境,访问外网必须通过指定的出口服务器,即可以访问外网的服务器,才能正常访问互联网。现需要在内网环境访问互联网的域名地址,如访问www.baidu.com,则需要通过代理 IP 和端口才能去访问外网的域名。

  • 配置说明: 内网通过指定服务器的172.18.36.20:80访问外网域名api.server.com

    1. 正向代理: 正向代理代表客户端向服务器发送请求, 隐藏客户端身份
    2. 反向代理: 反向代理代表服务器向客户端发送响应, 隐藏服务器身份
    # 根据使用场景, 我们的PC电脑接入的是政务机构的局域网(内网)环境, 要想访问外网域名api.server.com, 可以在内网环境的电脑主机通过浏览器访问172.18.36.20这台服务器的80端口从而访问到域名网址, 这种方式向互联网隐藏了客户端的身份信息, 属于正向代理,说明:此处的api.server.com只是个虚构的域名。
    
    # NGINX配置
    server {
    	listen       80;
    	server_name  172.18.36.20;
    	
    	# 访问http://172.18.36.20:80/代理访问https:/api.server.com:443
    	location / {
    		proxy_send_timeout 600;
    		proxy_read_timeout 600;
    		proxy_connect_timeout 600;
    		proxy_redirect off;
    		proxy_set_header Host api.server.com;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		proxy_pass https://api.server.com:443/;
    	    add_header Access-Control-Allow-Origin *;
    	}
    
    	# 其他示例:访问http://172.18.36.20:80/map代理访问https://api.hlw.com:443/map
    	location /map {
    		proxy_send_timeout 600;
    		proxy_read_timeout 600;
    		proxy_connect_timeout 600;
    		proxy_redirect off;
    		proxy_set_header Host api.hlw.com;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		proxy_pass https://api.hlw.com:443/map;
    	    add_header Access-Control-Allow-Origin *;
    	}
    }
    

5.0 nginx 配置简介

  • nginx 基础配置及说明

    # user  nobody;#运行nginx的默认账号
    # nginx进程数,建议设置为等于CPU总核心数。
    worker_processes  1;
    
    # 事件区块开始
    events {
    	# 单个进程最大链接数(最大连接数=连接数*进程数)
    	# 根据硬件调整,与前面工作进程配合起来用,尽量大,但别把CPU跑到100%就行,每个进程允许的最多连接数,理论上为每台nginx服务器的最大连接数
    	worker_connections  1024;
    }
    
    # 设定http服务器,利用它的反向代理功能提供负载均衡支持
    http {
    	# include:导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中。
    	include       mime.types;
    	# 默认文件类型
    	default_type  application/octet-stream;
    
    	# 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设置为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载,注意:如果图片显示不正常把这个改成off
    	# sendfile指令指定,nginx是否调用sendfile函数(zero copy方式)来输出文件,对于普通应用,必须设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime
    	sendfile        on;
    	# 长连接超时事件,单位是秒
    	keepalive_timeout  65;
    
    	# 第一个server区块开始,表示一个独立的虚拟主机站点
    	server {
    		# 提供服务的端口,默认80
    		listen       80;
    		# 提供服务的域名主机名
    		server_name  localhost;
    
    		# 对 “/” 启动反向代理,第一个location区块开始
    		location / {
    			root   html;    # 服务默认启动目录,可以改成指定的目录位置
    			index  index.html index.htm; # 默认的首页文件,多个用空格分开
    		}
    
    		# 错误页面路由
    		# 出现对应的http状态码是,使用50x.html回应客户
    		error_page   500 502 503 504  /50x.html; 
    		# location区块开始,访问50x.html
    		location = /50x.html {
    			# 指定对应的站点目录为html
    			root   html; 
    		}
    
    	}
    }
    
  • nginx 其他配置及说明

    $ remote_addr 与 $ http_x_forwarded_for 用以记录客户端的ip地址
    $ remote_user:用来记录客户端用户名称
    $ time_local: 用来记录访问时间与时区
    $ request: 用来记录请求的url与http协议
    $ status: 用来记录请求状态;成功是200
    $ body_bytes_sent:记录发送给客户端文件主体内容大小
    $ http_referer:用来记录从那个页面链接访问过来的
    $ http_user_agent:记录客户端浏览器的相关信息