工作常用之Nginx

Nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 全局配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

# 事件模块配置
events {
worker_connections 1024;
}

# HTTP模块配置
http {
# MIME类型配置
include /etc/nginx/mime.types;
default_type application/octet-stream;

# 日志格式配置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

# 访问日志配置
access_log /var/log/nginx/access.log main;

# 服务器配置
server {
listen 80;
server_name example.com;

# 根目录配置
root /var/www/html;

# 静态文件缓存配置
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1y;
add_header Cache-Control "public";
}

# 反向代理配置
location /api {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 错误页面配置
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}

各个命令的作用:

  • user nginx;:指定 Nginx 进程的运行用户。
  • worker_processes auto;:设置 Nginx 使用的工作进程数量。
  • error_log /var/log/nginx/error.log;:指定错误日志文件的路径。
  • pid /var/run/nginx.pid;:指定存储 Nginx 进程 ID 的文件路径。
  • events:事件模块配置,用于设置 Nginx 处理连接的方式和参数。
  • http:HTTP模块配置,包含了全局的 HTTP 配置。
  • include /etc/nginx/mime.types;:引入 MIME 类型配置文件。
  • default_type application/octet-stream;:设置默认的 MIME 类型。
  • log_format:定义日志格式。
  • access_log /var/log/nginx/access.log main;:指定访问日志文件的路径和使用的日志格式。
  • server:定义一个服务器块,配置一个虚拟主机。
  • listen 80;:指定服务器监听的端口号。
  • server_name example.com;:指定服务器的域名。
  • root /var/www/html;:指定服务器的根目录。
  • location:根据请求的 URI 进行不同的处理。
  • expires 1y;:设置静态文件的缓存时间。
  • add_header Cache-Control "public";:添加响应头,控制缓存行为。
  • proxy_pass:反向代理配置,将请求转发到指定的后端服务器。
  • proxy_set_header:设置代理请求头,包括 Host、X-Real-IP 和 X-Forwarded-For。
  • error_page:定义错误页面的处理方式。
  • location = /50x.html:指定特定错误页面的路径。

Nginx之代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 443 ssl;
server_name twikoo.chengzc.club;
ssl_certificate /www/server/panel/vhost/ssl/1_twikoo.chengzc.club_bundle.crt;
ssl_certificate_key /www/server/panel/vhost/ssl/2_twikoo.chengzc.club.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#按照这个套件配置
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://127.0.0.1:8082;
}
}

将请求转发到指定的后端服务器,这里将请求转发到http://127.0.0.1:8082

Nginx之SSL、跨域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
server {
listen 80;
listen 443 ssl;
server_name chengzc.club; #填写绑定证书的域名
ssl_certificate /www/server/panel/vhost/ssl/1_chengzc.club_bundle.crt;
ssl_certificate_key /www/server/panel/vhost/ssl/2_chengzc.club.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#按照这个套件配置
ssl_prefer_server_ciphers on;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
# add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
location / {
root /www/wwwroot/blog/cheng/public; #站点目录
index index.html index.htm;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
#下边是为获取真实IP所做的设置
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Cookie,Set-Cookie,cookie_token';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
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;
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' '*';
#return 204;
}
}

#开启error_page
error_page 500 502 503 504 404 /404.html;
# 承接上面的location
location = /404.html {
# 放错误页面的目录路径。
root /www/wwwroot/blog/cheng/public;
}
access_log /www/wwwlogs/access_blog.log;
error_log /www/wwwlogs/access_blog_error.log;
}

这段 Nginx 配置代码用于配置一个服务器块,以下是对每个命令的解释:

  • listen 80;:监听80端口,处理HTTP请求。
  • listen 443 ssl;:监听443端口,处理HTTPS请求,并启用SSL。
  • server_name chengzc.club;:指定服务器的域名为chengzc.club,用于匹配请求的域名。
  • ssl_certificate:指定SSL证书的路径,用于加密和解密HTTPS连接。
  • ssl_certificate_key:指定SSL证书的私钥路径,用于解密HTTPS连接。
  • ssl_session_timeout:设置SSL会话超时时间。
  • ssl_protocols:指定支持的SSL协议版本,这里设置为TLSv1.2。
  • ssl_ciphers:指定支持的SSL密码套件,这里使用了一组安全的密码套件。
  • ssl_prefer_server_ciphers:告诉Nginx优先使用服务器端的密码套件。
  • if ($scheme = http):如果请求是HTTP协议,则执行以下操作。
  • return 301 https://$host$request_uri;:重定向HTTP请求到HTTPS。
  • location /:处理根路径的请求。
  • root /www/wwwroot/blog/cheng/public;:指定站点的根目录。
  • index index.html index.htm;:指定默认的索引文件。
  • proxy_set_header:设置代理请求头,包括Upgrade、Connection、Host、X-Real-IP、X-Forwarded-For和X-Forwarded-Proto。
  • add_header:添加响应头,包括Access-Control-Allow-Origin、Access-Control-Allow-Credentials、Access-Control-Allow-Methods、Access-Control-Allow-Headers和Access-Control-Expose-Headers。
  • if ($request_method = 'OPTIONS'):如果请求方法是OPTIONS,则执行以下操作。
  • error_page:定义错误页面的处理方式。
  • location = /404.html:处理特定的404错误页面。
  • access_log:指定访问日志文件的路径。
  • error_log:指定错误日志文件的路径。

这段配置主要实现了以下功能:

  • 监听80端口并重定向到443端口,实现HTTP到HTTPS的重定向。
  • 配置HTTPS连接,使用SSL证书进行加密。
  • 设置站点根目录和默认索引文件。
  • 配置反向代理,并设置一些代理请求头。
  • 添加跨域请求的响应头。
  • 处理错误页面和日志记录。

Nginx之转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
map $arg_url $proxy_host {
~*^https?://([^/:]+) $1;
default "";
}

server {
listen 443 ssl;
server_name xxx.chengzc.club;
resolver 8.8.8.8;
ssl_certificate /www/server/panel/vhost/ssl/1_xxx.chengzc.club_bundle.crt;
ssl_certificate_key /www/server/panel/vhost/ssl/2_xxx.chengzc.club.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
access_log /www/wwwlogs/access_xxx.log;
error_log /www/wwwlogs/access_error.log;

# location /chengzc {
# proxy_pass http://127.0.0.1:8086;
#
}

location / {
proxy_pass $arg_url;
# proxy_set_header Host $proxy_host;
proxy_set_header Referer "https://servicewechat.com";
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,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Cookie,Set-Cookie,cookie_token';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
}
}

这段 Nginx 配置代码包含了一个 map 块和一个服务器块,以下是对每个命令的解释:

  • map $arg_url $proxy_host:定义一个变量映射,根据 $arg_url 的值设置 $proxy_host 的值。正则表达式 ~*^https?://([^/:]+) $1 用于从 $arg_url 中提取主机名。
  • default "":如果没有匹配到任何值,则将 $proxy_host 设置为空字符串。
  • listen 443 ssl;:监听443端口,处理HTTPS请求,并启用SSL。
  • server_name xxx.chengzc.club;:指定服务器的域名为 xxx.chengzc.club,用于匹配请求的域名。
  • resolver 8.8.8.8;:指定用于解析主机名的DNS服务器。
  • ssl_certificate:指定SSL证书的路径,用于加密和解密HTTPS连接。
  • ssl_certificate_key:指定SSL证书的私钥路径,用于解密HTTPS连接。
  • ssl_session_timeout:设置SSL会话超时时间。
  • ssl_protocols:指定支持的SSL协议版本,这里设置为TLSv1.2。
  • ssl_ciphers:指定支持的SSL密码套件,这里使用了一组安全的密码套件。
  • ssl_prefer_server_ciphers:告诉Nginx优先使用服务器端的密码套件。
  • access_log:指定访问日志文件的路径。
  • error_log:指定错误日志文件的路径。
  • location /:处理根路径的请求。
  • proxy_pass $arg_url;:将请求转发到由 $arg_url 指定的后端服务器。
  • proxy_set_header:设置代理请求头,包括Referer。
  • add_header:添加响应头,包括Access-Control-Allow-Origin、Access-Control-Allow-Credentials、Access-Control-Allow-Methods、Access-Control-Allow-Headers和Access-Control-Expose-Headers。

这段配置主要实现了以下功能:

  • 根据请求参数 $arg_url 提取主机名,并将其赋值给变量 $proxy_host
  • 监听443端口,处理HTTPS请求,并启用SSL加密。
  • 配置SSL证书和私钥的路径。
  • 设置SSL会话超时时间和支持的SSL协议版本。
  • 配置SSL密码套件。
  • 设置访问日志和错误日志的路径。
  • 将请求转发到由 $arg_url 指定的后端服务器。
  • 设置代理请求头和响应头,包括Referer和跨域请求的相关头部。

引入更多配置

1
include /www/server/panel/vhost/nginx/*.conf;