nginx配置文件


nginx配置文件

1、主配置文件

# 定义nginx worker进程运行的用户和用户组,默认为nobody nobody。
# user指令在Windows上不生效,如果你制定具体用户和用户组会报小面警告
# user [user] [group]
user  nobody;
# 指定工作线程数,可以制定具体的进程数,也可使用自动模式,这个指令只能在全局块配置
# worker_processes number | auto;
# 如果指定进程数的话,建议设置为等于CPU总核心数。默认为1
# 列子:指定4个工作线程,这种情况下会生成一个master进程和4个worker进程
worker_processes  auto;
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
pid        logs/nginx.pid;
#include /usr/share/nginx/modules/*.conf;
events {
	worker_connections  1024;
}

http {
	#根据二级域名动态地选择SSL证书,可以使用map配合 
    #server_name 和 ssl_certificate 的方式实现,但只能在 http 块中使用 map 指令
    #不能直接在 server 块中拼接变量路径使用 ssl_certificate,
    #因为 Nginx 的证书加载是在启动阶段完成的,不支持在运行时动态解析变量路径
    #可以通过 SNI(Server Name Indication)机制 + 多个 server 块 + 正则匹配
    #+ map 实现“看起来动态”的选择
    #前提是Nginx 默认启用 SNI,确保你使用的版本 ≥ 1.15
    #适用于不同子域名需要不同证书的场景
	map $ssl_server_name $ssl_cert {  
        ~^(?<subdomain>[^.]+)\.ymxl\.me$ /usr/local/nginx/ymxl.me-nginx-config/certs/$subdomain.ymxl.me.pem;
		default /usr/local/nginx/ymxl.me-nginx-config/certs/ymxl.me.pem;
    }
    map $ssl_server_name $ssl_key {
        ~^(?<subdomain>[^.]+)\.ymxl\.me$ /usr/local/nginx/ymxl.me-nginx-config/certs/$subdomain.ymxl.me.key;
		default /usr/local/nginx/ymxl.me-nginx-config/certs/ymxl.me.key;
    }

	#使用 map 提取二级域名(子域名)后续用于将二级域名提取出来用于动态拼接日志路径
	map $host $subdomain {
			default "home";
			~^(?<sub>[^.]+)\.ymxl\.me$ $sub;
		}
	resolver 127.0.0.1  valid=60s ipv6=off;
	include       mime.types;
	default_type  application/octet-stream;
	log_format  mini  'ymxl-- [$remote_addr] - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
	access_log  logs/ymxl.me-access.log  mini; #配置访问日志
	error_log   logs/ymxl.me-error.log;  #配置错误日志
    sendfile        on;
	#tcp_nopush     on;
    #下面配置的含义是,在服务器端保持连接的时间设置为120s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100s。
    keepalive_timeout 120s 100s ;
    #gzip  on;
	include /usr/local/nginx/ymxl.me-nginx-config/modules/*.conf;
}

2、ymxl.me-nginx-config中的模块配置文件

ymxl.me-nginx-config文件夹结构如图:

image-20250617135830431

具体的server模块配置文件

#网站ymxl.me的server配置
#强制SSL强制将其定向为https
server {
	listen       80;
	listen       [::]:80;
	server_name  .ymxl.me;#匹配以 ymxl.me 结尾的所有域名
	return 301 https://$host$request_uri;
}
#SSL配置
server {
	listen       443 ssl;
	listen       [::]:443 ssl;
	#使用正则表达式捕获子域名部分,并存储在变量 subdomain 中。
	server_name  ~^(?<subdomain>[^.]+)\.ymxl\.me$;
	if ($subdomain = "") {
            set $subdomain "home";
        }
    #配置访问日志
	access_log  ymxl.me-nginx-config/logs/$subdomain.ymxl.me-access.log  mini; 
    #配置错误日志
	error_log   ymxl.me-nginx-config/logs/$subdomain.ymxl.me-error.log; 
	#这里的相对路径要加上../,下面的location中不需要加这个
	#ssl_certificate         ../ymxl.me-nginx-config/certs/${subdomain}.ymxl.me.pem;
	#ssl_certificate_key     ../ymxl.me-nginx-config/certs/${subdomain}.ymxl.me.key;
	ssl_certificate     $ssl_cert;
    ssl_certificate_key $ssl_key;
	#启用会话缓存减少性能损耗
	ssl_session_cache    shared:SSL:10m;
	ssl_session_timeout  24h;
	ssl_ciphers  HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;
	location / {
		root   ymxl.me-nginx-config/www/$subdomain;
		index  index.html index.htm;
	}
    #反向代理今日热榜接口api
	location /dailyhot-api/ {
		proxy_pass http://39.104.18.168:6688/;
		proxy_set_header Host $host;
		proxy_set_header Remote_Addr $remote_addr;
		proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
	}
	#配置错误页面
	error_page  400 403 404         /miss.html;
	error_page  500 502 503 504     /err.html;
	location = /miss.html {
		internal;
		default_type text/html;
		add_header Content-Type 'text/html;charset=utf-8';
		return 404 'Page not found';
	}
	location = /err.html {
		internal;
		default_type text/html;
		add_header Content-Type 'text/html;charset=utf-8';
		return 502 'The server is down';
	}
}

上述方向代理的过程及说明:

#反向代理今日热榜接口api
	location /dailyhot-api/ {
		proxy_pass http://39.104.18.168:6688/;
		proxy_set_header Host $host;
		proxy_set_header Remote_Addr $remote_addr;
		proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
	}

原因:首先你的网站是通过 HTTPS 加载的,但它请求了一个 HTTP 的接口。现代浏览器出于安全考虑,阻止了这种混合内容(Mixed Content),即通过 HTTPS 加载的页面试图通过 HTTP 加载资源

解决:代理请求,首先我们的应用是https的,但是要请求的接口服务是http的,正常的请求是无法进行的,可以通过Nginx 配置反向代理设置一个代理,将 HTTP 请求通过 HTTPS 转发到后端接口。这样,你的前端始终通过 HTTPS 发起请求,而代理服务器会与后端通过 HTTP 通信

如果你的后端接口还没有启用 HTTPS,可以在 Nginx 或其他反向代理服务器上配置,将 HTTPS 请求转发到 HTTP 服务

如图的请求地址

image-20250618083754386

前提条件要给logs路径添加读写权限才能生效

sudo chown -R nobody:nobody /usr/local/nginx/ymxl.me-nginx-config/logs
#755属主有读写执行,其他人有读和执行(推荐)
sudo chmod 755 /usr/local/nginx/ymxl.me-nginx-config/logs

生成的动态日志路径如图:

image-20250617135257630


文章作者: Liu Yuan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Liu Yuan !
—— 评论区 ——
  目录