:::info 💡 根据 遗忘曲线:如果没有记录和回顾,6天后便会忘记75%的内容
读书笔记正是帮助你记录和回顾的工具,不必拘泥于形式,其核心是:记录、翻看、思考 :::

Nginx 全局配置文件

  1. nginx.conf # 全局配置文件,对全局生效
  2. ├── events # 配置影响 Nginx 服务器或与用户的网络连接
  3. ├── http # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
  4. ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
  5. ├── server # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
  6. ├── server
  7. ├── location # server 块可以包含多个 location 块,location 指令用于匹配 uri
  8. ├── location
  9. └── ...
  10. └── ...
  11. └── ...
  1. user nginx; # 运行用户,默认即是nginx,可以不进行设置
  2. worker_processes 1; # Nginx 进程数,一般设置为和 CPU 核数一样
  3. error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录
  4. pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置
  5. # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
  6. # include /usr/share/nginx/modules/*.conf;
  7. events {
  8. use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
  9. worker_connections 1024; # 每个进程允许最大并发数
  10. }
  11. http { # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
  12. # 设置日志模式
  13. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. '$status $body_bytes_sent "$http_referer" '
  15. '"$http_user_agent" "$http_x_forwarded_for"';
  16. access_log /var/log/nginx/access.log main; # Nginx访问日志存放位置
  17. sendfile on; # 开启高效传输模式
  18. tcp_nopush on; # 减少网络报文段的数量
  19. tcp_nodelay on;
  20. keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
  21. types_hash_max_size 2048;
  22. include /etc/nginx/mime.types; # 文件扩展名与类型映射表
  23. default_type application/octet-stream; # 默认文件类型
  24. # include /etc/nginx/conf.d/*.conf; # 加载子配置项
  25. server {
  26. listen 80; # 配置监听的端口
  27. server_name localhost; # 配置的域名
  28. location / {
  29. root /usr/share/nginx/html; # 网站根目录
  30. index index.html index.htm; # 默认首页文件
  31. deny 172.168.22.11; # 禁止访问的ip地址,可以为all
  32. allow 172.168.33.44 # 允许访问的ip地址,可以为all
  33. }
  34. error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
  35. location = /50x.html {
  36. }
  37. error_page 400 404 error.html; # 同上
  38. location = /40x.html {
  39. }
  40. }
  41. server {
  42. listen 443 ssl http2 default_server;
  43. listen [::]:443 ssl http2 default_server;
  44. server_name _;
  45. root /usr/share/nginx/html;
  46. ssl_certificate "/etc/pki/nginx/server.crt";
  47. ssl_certificate_key "/etc/pki/nginx/private/server.key";
  48. ssl_session_cache shared:SSL:1m;
  49. ssl_session_timeout 10m;
  50. ssl_ciphers PROFILE=SYSTEM;
  51. ssl_prefer_server_ciphers on;
  52. # Load configuration files for the default server block.
  53. # include /etc/nginx/default.d/*.conf;
  54. location / {
  55. }
  56. error_page 404 /404.html;
  57. location = /40x.html {
  58. }
  59. error_page 500 502 503 504 /50x.html;
  60. location = /50x.html {
  61. }
  62. }
  63. }

配置反向代理

通过proxy_pass配置,设置简单的代理,配置完成nginx -s reload重新加载nginx配置文件

  1. server {
  2. listen 80 default_server;
  3. listen [::]:80 default_server;
  4. server_name zee.onl;
  5. root /usr/share/nginx/html;
  6. # Load configuration files for the default server block.
  7. # include /etc/nginx/default.d/*.conf;
  8. # 通过proxy_pass配置,将访问zee.onl跳转到bilibili网站
  9. location / {
  10. proxy_pass http://www.bilibili.com;
  11. }
  12. error_page 404 /404.html;
  13. location = /40x.html {
  14. }
  15. error_page 500 502 503 504 /50x.html;
  16. location = /50x.html {
  17. }
  18. }

反向代理的其他命令

proxy_set_header:在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。 proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。 proxy_read_timeout:配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。 proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。 proxy_redirect:用于修改后端服务器返回的响应头中的Location和Refresh

解决CORS跨域问题

通过反向代理配置

  1. # 在前端服务地址为 fe.sherlocked93.club 的页面
  2. # 请求 be.sherlocked93.club 的后端服务导致的跨域,可以这样配置
  3. server {
  4. listen 9001;
  5. server_name fe.sherlocked93.club;
  6. location / {
  7. proxy_pass be.sherlocked93.club;
  8. }
  9. }
  10. # 以上配置,对域名 fe.sherlocked93.club 的请求全都代理到了 be.sherlocked93.club,
  11. # 前端的请求都被我们用服务器代理到了后端地址下,绕过了跨域

通过请求头配置

当浏览器在访问跨源的服务器时,也可以在跨域的服务器上直接设置 Nginx,从而前端就可以无感地开发,不用把实际上访问后端的地址改成前端服务的地址,这样可适性更高。 最后通过nginx -s reload重载配置

  1. # 在 /etc/nginx/conf.d/ 文件夹中新建一个配置文件,对应二级域名 be.sherlocked93.club
  2. server {
  3. listen 80;
  4. server_name be.sherlocked93.club;
  5. add_header 'Access-Control-Allow-Origin' $http_origin; # 全局变量获得当前请求origin,带cookie的请求不支持*
  6. add_header 'Access-Control-Allow-Credentials' 'true'; # 为 true 可带上 cookie
  7. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; # 允许请求方法
  8. add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers; # 允许请求的 header,可以为 *
  9. add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
  10. if ($request_method = 'OPTIONS') {
  11. add_header 'Access-Control-Max-Age' 1728000; # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求
  12. add_header 'Content-Type' 'text/plain; charset=utf-8';
  13. add_header 'Content-Length' 0;
  14. return 204; # 200 也可以
  15. }
  16. location / {
  17. root /usr/share/nginx/html/be;
  18. index index.html;
  19. }
  20. }

区分静态文件请求和后端请求

这里对静态文件的请求和后端服务的请求都以 fe.sherlocked93.club 开始,不易区分,所以为了实现对后端服务请求的统一转发,通常我们会约定对后端服务的请求加上 /apis/ 前缀或者其他的 path 来和对静态资源的请求加以区分,此时我们可以这样配置:

  1. # 请求跨域,约定代理后端服务请求path以/apis/开头
  2. location ^~/apis/ {
  3. # 这里重写了请求,将正则匹配中的第一个分组的path拼接到真正的请求后面,并用break停止后续匹配
  4. rewrite ^/apis/(.*)$ /$1 break;
  5. proxy_pass be.sherlocked93.club;
  6. # 两个域名之间cookie的传递与回写
  7. proxy_cookie_domain be.sherlocked93.club fe.sherlocked93.club;
  8. }

配置负载均衡

目的旨在实现服务器压力分流

常见的负载均衡的方式

  1. 轮询:默认方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务挂了,能自动剔除

  2. weight权重分配:权重分配,指定轮询几率,权重越高,在被访问的概率越大,用于后端服务器性能不均的情况

  3. ip_hash:每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决动态网页 session 共享问题。负载均衡每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的

  1. http {
  2. upstream myserver {
  3. # ip_hash; # ip_hash 方式
  4. # fair; # fair 方式
  5. server 127.0.0.1:8081; # 负载均衡目的服务地址
  6. server 127.0.0.1:8080;
  7. server 127.0.0.1:8082 weight=10; # weight 方式,不写默认为 1
  8. }
  9. server {
  10. location / {
  11. proxy_pass http://myserver;
  12. proxy_connect_timeout 10;
  13. }
  14. }
  15. }

配置HTTPS

  1. server {
  2. listen 443 ssl http2 default_server; # SSL 访问端口号为 443
  3. server_name sherlocked93.club; # 填写绑定证书的域名
  4. # 下载通过良心云申请的ssl压缩文件,将里面nginx的xxx.crt和xxx.key拷贝到服务器目录
  5. ssl_certificate /etc/nginx/https/1_sherlocked93.club_bundle.crt; # 证书文件地址
  6. ssl_certificate_key /etc/nginx/https/2_sherlocked93.club.key; # 私钥文件地址
  7. ssl_session_timeout 10m;
  8. ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照以下协议配置
  9. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  10. ssl_prefer_server_ciphers on;
  11. location / {
  12. root /usr/share/nginx/html;
  13. index index.html index.htm;
  14. }
  15. }
  16. # 以上配置完成,
  17. # 通过nginx -s reload重载配置就可以通过https://sherlocked93.club/访问网站了
  18. #

增强安全性的配置命令:

add_header X-Frame-Options DENY; # 减少点击劫持 add_header X-Content-Type-Options nosniff; # 禁止服务器自动解析资源类型 add_header X-Xss-Protection 1; # 防XSS攻击

HTTP请求转发到HTTPS

  1. server {
  2. listen 80;
  3. server_name www.sherlocked93.club;
  4. # 单域名重定向
  5. if ($host = 'www.sherlocked93.club'){
  6. return 301 https://www.sherlocked93.club$request_uri;
  7. }
  8. # 全局非 https 协议时重定向
  9. if ($scheme != 'https') {
  10. return 301 https://$server_name$request_uri;
  11. }
  12. # 或者全部重定向
  13. return 301 https://$server_name$request_uri;
  14. # 以上配置选择自己需要的即可,不用全部加
  15. }


相关资料

Nginx 从入门到实践,万字详解:https://juejin.cn/post/6844904144235413512#heading-9 Nginx 入门教程:https://xuexb.github.io/learn-nginx/ 找到nginx服务使用的配置文件:https://blog.csdn.net/sinat_24354307/article/details/124518927