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文件夹结构如图:

具体的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 服务
如图的请求地址

前提条件要给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生成的动态日志路径如图:


