nginx 配置总结

简介: # Nginx 常用配置 ## 为什么写这篇文章? 1. 在工作中发现很多开发者只关注于开发,认为 nginx 属于运维的事,然而无论大小公司,开发中都会涉及到一部分服务器配置,小公司基本都是开发和运维一体。即使是大公司可能也会涉及到一些 cors、特殊 http 头配置问题。尤其是 cors,很多人不知道完整的 http 配置 2. 一些人想搭建自己的服务器,但是服务器不太会配置

Nginx 常用配置

为什么写这篇文章?

  1. 在工作中发现很多开发者只关注于开发,认为 nginx 属于运维的事,然而无论大小公司,开发中都会涉及到一部分服务器配置,小公司基本都是开发和运维一体。即使是大公司可能也会涉及到一些 cors、特殊 http 头配置问题。尤其是 cors,很多人不知道完整的 http 配置
  2. 一些人想搭建自己的服务器,但是服务器不太会配置
  3. 记录,供日后查看(由于涉及内容太多,只写关键内容,如需要更详细内容,还请搜索关键词,确实有必要,可以留言添加)

我的配置

nginx.conf


user       web_admin; # 一般网站出现403之类的,可能是nginx 网站文件夹权限配置错误,或者是这个配的用户错误
worker_processes  1; # 一般设置成逻辑CPU的数量

error_log  /var/log/nginx/error.log warn; # 错误日志,
pid        /var/run/nginx.pid;
worker_rlimit_nofile 65535;

events {
   
    worker_connections  4096;
}


http {
   
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    index    index.html;

    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; # 访问日志,格式采用上面定义的 main

    sendfile       on;
    tcp_nopush     on;
    etag on;
    expires 3d; # 缓存
    server_names_hash_bucket_size 128;

    keepalive_timeout  65;

    # gzip config
    gzip on;
    gzip_min_length 1k; # 小于 1kb 的内容可能压缩完体积更大
    gzip_comp_level 9;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\."; # 现在加不加这个无所谓了,因为IE6早就没了

    include /etc/nginx/conf.d/*.conf; # 导入/etc/nginx/conf.d 下面的所有.conf 配置文件
}

yingyj.com.conf

server {
   
    server_name yingyj.com www.yingyj.com;
    listen 443 ssl http2;
    include /etc/nginx/ssl/options-ssl-nginx.conf;

    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;

    root /home/web_admin/www/yingyj.com;
    #charset koi8-r;
    access_log /var/log/nginx/yingyj.com.access.log  main;
    location / {
   
        autoindex on;
        autoindex_exact_size off;
        index index.html;
    }
    location = /50x.html {
   
        root /usr/share/nginx/html;
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504  /50x.html;
}
# 完全不使用 http 可以采用下面的配置,将本机80 端口转到要访问的 https 网址
server {
   
    listen 80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

ssl/options-ssl-nginx.conf

# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.

ssl on;

ssl_session_cache shared:le_nginx_SSL:20m;
ssl_session_timeout 60m;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

# https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility
# 这个参数会影响浏览器兼容性
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';

ssl_certificate /etc/nginx/ssl/yingyj.com/fullchain.cer; # 不用这个
ssl_certificate_key /etc/nginx/ssl/yingyj.com/yingyj.com.key;
# ssl_trusted_certificate /etc/nginx/ssl/yingyj.com/fullchain.cer;

关于安装

公司使用建议自己编译,有利于优化,个人小站点不想折腾可以直接 使用 linux 的包管理工具安装。笔者的服务器采用编译安装,主要是想尝试下 TLS 1.3,编译教程参考imququ.com

HTTPS

个人站点直接使用 letsencrypt (支持泛域名),然后采用定时任务自动续签证书。笔者看到国外有些企业也是使用 letsencrypt,而国内公司都是采用付费证书。

证书配置完成之后可以用 ssllabs 检查,有问题的项会高亮显示,兼容和安全有时候需要取舍。

其中 ssl_ciphers 决定启用哪些 Cipher suites,会影响浏览器兼容,具体请看 wiki

HSTS 不正确配置会导致网址无法访问,使用之后只能使用https访问网站,一定程度保证安全性。chrome等浏览器,会将正确设置了HSTS add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always; 的网址加入硬编码。

使用 HTTP2 的前提的 开始HTTPS, listen 443 ssl http2;

不用HTTPS?,难道你想要你的网站被窜改?比如突然弹个广告、比如恶意链接、如果打赏二维码换成别人的 :)

cors

笔者更意向于将必要资源使用 nginx 放到一个域名,不存在跨域,自然也就没有cors需求。

cors 涉及的 http header

  1. Access-Control-Allow-Origin: | 使用 虽然可以适用大部分情景,但是他不够安全,部分场景(如支付相关逻辑层面不允许使用 *)
  2. Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header 让服务器把允许浏览器访问的头放入白名单
  3. Access-Control-Max-Age: 指定了preflight请求的结果能够被缓存多久
  4. Access-Control-Allow-Credentials: true 是否允许携带cookie
  5. Access-Control-Allow-Methods: [, ]* 涉及到复杂请求需要使用 OPTIONS 请求,大部分公司使用 GET, POST, OPTIONS
  6. Access-Control-Allow-Headers: [, ] 指明了实际请求中允许携带的HTTP header, *有时候使用CDN,需要携带特殊的CDN头,否者无法请求

缓存

缓存分以下几类:

  1. 服务器缓存(如 Redis 之类)
  2. CDN 缓存,部分 CDN 文件更新之后无法立即生效
  3. 浏览器缓存(强缓存、协商缓存、ServiceWorker?)

其中1、2和本文无关,暂不言表。

强缓存和HTTP header 的Cache-ControlExpires 有关Cache-Control优先级高于Expires`。若本地有对应文件缓存且缓存还在有效期,则直接使用本地缓存。

协商缓存和多个 成对的 http 头有关,分别是:

  1. EtagIf-None-Match 优先级高于第二个 (nginx 开启 etag on;)
  2. Last-ModifiedIf-Modified-Since
  3. Vary

完全禁用缓存:Cache-Control: no-cache, no-store, must-revalidate

对于不放cdn的文件,一般来说,我们可以将永远不会变的文件设置很长时间的强缓存(比如 js 插件)。而现在的前端文件,一般都是 hash 文件名,除了html 文件,所以我们只需要根据需求设置好 html 文件缓存,其他文件可以强缓存。

有时候遇到前端文件全部放cdn,导致 index.html 文件被错误缓存了,可以考虑将 index.html 单独提取出来。

本文章使用 markdown 编辑器 Typora 编辑,推荐使用。

目录
相关文章
|
3月前
|
编解码 应用服务中间件 Linux
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
428 1
|
7月前
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
797 87
|
7月前
|
负载均衡 应用服务中间件 nginx
Nginx配置与命令
Nginx 是一款高性能的 HTTP 和反向代理服务器,其配置文件灵活且功能强大。本文介绍了 Nginx 配置的基础结构和常用指令,包括全局块、Events 块、HTTP 块及 Server 块的配置方法,以及静态资源服务、反向代理、负载均衡、HTTPS 和 URL 重写等功能实现。此外,还提供了常用的 Nginx 命令操作,如启动、停止、重载配置和日志管理等,帮助用户高效管理和优化服务器性能。
|
3月前
|
Ubuntu 安全 应用服务中间件
详细指南:配置Nginx服务器在Ubuntu平台上
以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
309 18
|
3月前
|
Ubuntu 安全 应用服务中间件
详细指南:配置Nginx服务器在Ubuntu平台上
以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
391 17
|
4月前
|
数据建模 应用服务中间件 PHP
配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
本示例演示如何通过Docker挂载同一宿主目录至Nginx与PHP容器,实现PHP项目运行环境配置。需注意PHP容器中监听地址修改为0.0.0.0:9000,并调整Nginx配置中fastcgi_pass指向正确的IP与端口。同时确保Nginx容器中/var/www/html权限正确,以避免访问问题。
配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
|
5月前
|
应用服务中间件 网络安全 nginx
配置Nginx以支持Websocket连接的方法。
通过上述配置,Nginx将能够理解WebSocket协议的特殊要求,代理Websocket流量到合适的后端服务器。注意,Websocket并不是HTTP,尽管它最初是通过HTTP请求启动的连接升级,因此保证Nginx了解并能够妥善处理这种升级流程是关键。
1367 10
|
4月前
|
Ubuntu 应用服务中间件 Linux
在Ubuntu上配置Nginx实现开机自启功能
至此,Nginx应该已经被正确地设置为开机自启。在Ubuntu中利用 `systemd`对服务进行管理是一种高效的方式,为系统管理员提供了强大的服务管理能力,包括但不限于启动、停止、重启服务,以及配置服务的开机自启动。通过这些简洁的命令,即使是对Linux不太熟悉的用户也能轻松地进行配置。
232 0
|
6月前
|
安全 应用服务中间件 网络安全
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
468 0
Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
|
6月前
|
JSON 前端开发 应用服务中间件
配置Nginx根据IP地址进行流量限制以及返回JSON格式数据的方案
最后,记得在任何生产环境部署之前,进行透彻测试以确保一切运转如预期。遵循这些战术,守卫你的网络城堡不再是难题。
291 3