nginx 线上那些实用的最佳实践

虽然公司小,但随着时间的推移各种需求,产线的复杂度逐渐增提升。原先一个线上项目只要解决跨域代理的问题,现在可能会解决各种问题。当没有运维或第三方的支持时,nginx 就由我们万能的前端来对接。何况前端本来就应该能 hold 它。

Nginx 基础,可以参考 http://eminoda.github.io/2018/08/10/nginx-basic-learn/

以下列出一些使用心得,如果有错误欢迎 issue

API 接口统一代理

比如有个 3000 端口的 node 云服务,为了更好的管理接口,前端统一以 /api 作为接口前缀。

http://test.eminoda.com:81/api/getUsers => http://127.0.0.1:3000/getUsers

123456
location ^~ /api/ {  proxy_set_header host                $host;  proxy_set_header X-forwarded-for     $proxy_add_x_forwarded_for;  proxy_set_header X-real-ip           $remote_addr;  proxy_pass http://127.0.0.1:3000/;}

后缀匹配,解决老业务.do、.action 等接口/页面

123456
location ~* /*.do$ {  proxy_set_header host                $host;  proxy_set_header X-forwarded-for     $proxy_add_x_forwarded_for;  proxy_set_header X-real-ip           $remote_addr;  proxy_pass http://127.0.0.1:8080;}

指定专有域名

可以开设多个子域名,只要云上做了泛解析。

举例,完成接口统一接入

1234567891011
server {  listen          80;  server_name     api.eminoda.com;

  location / {    proxy_set_header host                $host;    proxy_set_header X-forwarded-for	 $proxy_add_x_forwarded_for;    proxy_set_header X-real-ip           $remote_addr;    proxy_pass http://127.0.0.1:3000;  }}

移动端 page

123456
server {  listen          80;  server_name     h5.eminoda.com;

  ...}

指定默认域名

通常会在 nginx 维护多个 server_name,当访问的 host 不存在,但服务器 ip 又被解析,nginx 根据它的机制给出默认的请求域名(可能根据配置文件的排序等)

使用 default_server 指定默认 server

12345
server {  listen          80 default_server;  server_name     www.niu100.com;  ...}

日志管理

安装 nginx 后,会有默认的配置结构。

123456
http {    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;}

如果没有专门的数据分析,作为问题回溯,这样基本够用了。

1
114.34.159.157 - - [18/Oct/2018:13:28:37 +0800] "GET / HTTP/1.1" 403 571 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" "-"

但是如果有些具体的数据打标,跟踪需求,可以参考如下配置:

业务 cookie 信息的获取

1234
set $userId "-";  if ( $http_cookie ~* "userId=(S+)(;.*|$)" ){    set $userId $1;  }

爬虫请求确认,如果你们有 seo 之类的统计

1234
set $spider "-";if ($http_user_agent ~* "Baiduspider|Googlebot|Sosospider"){  set $spider "1";}

设置 logger format,输出位置

12345
log_format  eminoda  '$remote_addr $http_x_forwarded_for - [$time_local] '                    '$request $status $body_bytes_sent $request_time '                    '$userId $http_user_agent $spider';

access_log  /var/log/nginx/my-access.log  eminoda;

整理 nginx 文件

nginx 是一个 http 服务,里面包含多个 server,当项目复杂起来,一定会造成杂乱的配置。这时需要一定的 整理,方便日后修改。根据个人习惯吧

不同 server

123456
http {    include /etc/nginx/server/api.eminoda.conf;    include /etc/nginx/server/static.emionda.conf;    include /etc/nginx/server/eminoda.*.conf;    ...}

相同配置抽取

12345678910111213
server {    listen          80 default_server;    server_name     www.eminoda.com;

    # ip拦截    include /etc/nginx/conf/ipLimit.conf;    # 业务信息打标    include /etc/nginx/conf/bussMark.conf;    # 接口代理代理    include /etc/nginx/conf/proxy_A.conf;    include /etc/nginx/conf/proxy_B.conf;    ...}

配置 SSL——https

市面上有很多免费的证书提供商,以下给出阿里云的默认配置

https://www.eminoda.com

12345678910111213141516
server {        listen 443;        server_name www.eminoda.com;        ssl on;        ssl_certificate   cert-eminoda/123.pem;        ssl_certificate_key  cert-eminoda/123.key;        ssl_session_timeout 5m;        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;        ssl_prefer_server_ciphers on;

	location / {		...    }}

自动跳转 https 站点

google 对 https 站的 seo 会更好,像安全性等好处这里不做展开

123456789101112
server {  listen 80;  server_name  www.eminoda.com;

  location / {    proxy_set_header Host $http_host;    proxy_set_header host                $host;    proxy_set_header X-forwarded-for     $proxy_add_x_forwarded_for;    proxy_set_header X-real-ip           $remote_addr;    rewrite ^/(.*) https://www.eminoda.com/$1 permanent;  }}

多端的适配

实现在移动端访问 PC 页面,重定向到手机页面

123
if ($http_user_agent ~* "(Mobile|Android|iPad|iPhone|iPod|BlackBerry|Windows Phone)") {    rewrite ^/ http://h5.eminoda.com redirect;}

IP 限制

123
if ( $http_x_forwarded_for ~ "106.120.121.128$|106.120.121.129$|106.120.121.1[3-5][0-9]$") {    rewrite ^/ http://limit.eminoda.com/limit.html rewrite;}

短连接

可能因为短信运营商的字符数量限制、业务需要,要尽可能缩短链接长度。

http://l.em.com/123456789/987654321 ==> http://www.eminoda.com/aaa/bbb/123456789?id=987654321

12345
server {  listen          80;  server_name     l.em.com;  rewrite ^/(d+)/(d+) http://www.eminoda.com/aaa/bbb/$1?id=$2  rewrite;}

异常错误页面的指定

服务器宕机、发布,网页的超时等因素,默认 nginx 的错误页面可能令用户产生疑惑。需要指定 error page,提升体验。

123
error_page 404 = http://m.eminoda.com/404;error_page 405 = http://m.eminoda.com/405;error_page 500 = http://m.eminoda.com/500;

原文:大专栏  nginx 线上那些实用的最佳实践

原文地址:https://www.cnblogs.com/wangziqiang123/p/11618164.html

时间: 2024-11-09 03:22:05

nginx 线上那些实用的最佳实践的相关文章

学画线框图:10个最佳实践

在设计过程的线框图绘制阶段,我们的思路很不成熟和粗糙.无论在废纸上.白板上或者用软件,绘制线框图有助于建立项目中各种元素之间的关系.这些元素譬如导航.图形.操作调用等.但是,如果我们将线框图当成一种工具,其使用目的就应当是:建立针对设计方案的用于协作沟通的创意空间,同时支持迭代和驱动快速思维. 那么如何才能使线框图成为有效驱动设计沟通呢? 评判的最佳方法是退一步,然后问一问这个问题:当我分享我的线框图时,沟通的内容与执行相关还是与我要创建的体验相关? 如果你的创造性头脑风暴和讨论被陷于"线框图看

测试通过!为何线上还有很多BUG?实践中的质量控制

质量控制 大多数测试人员认为测试工作是发现bug,虽然这是测试的主要任务,但其实测试最重要的任务是质量控制,而发现bug和验证bug只是质量控制的一个重要环节而已. 我想很多测试人员都经历过这样的场景,就是测试环境全部都能测试通过,但正式上线之后就会有各种各样的bug,到底是哪里出了问题呢? 在测试工作中,常见的问题原因分为以下几类: ●不同版本的数据兼容 这是最常见的问题,一般新版本的迭代不仅仅是代码层面的,还有数据库的改动,而对于线上原有的数据来说改动了数据库有可能会受到影响. 举个例子:

nginx线上一次临时小小配置记录

由于用到了开源产品接入游戏sdk服务器,因此将nginx 80端口转向了40000 因此nginx访问会出现这种情况: 404 not found 好久没有配置这个了,百度了一下很多坑,不信你自己百度试试,404 not found鬼知道会给你带来什么,于是自己琢磨了下,打开配置文件看看后才知道原来问题在: proxy_pass http://127.0.0.1:40000; 于是修改配置,nginx -t之后检查 nginx: the configuration file /etc/nginx

Nginx Location配置总结及基础最佳实践

参考来源: http://blog.zol.com.cn/1067/article_1066186.html,http://flandycheng.blog.51cto.com/855176/280121 语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空

转 Web程序优化的最佳实践:JavaScript和CSS篇

Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了 一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是旨在提高网站性能. Excetional Performance 团队总结出了一系列可以提高网站速度的方法.可以分为 7 大类 34 条.包括内容.服务器.cookie.CSS.JavaScript.图片.移动应用等七部分. 本文为CSS和Javascript部分: 除此之外,JavaScript

Spark深入浅出企业级最佳实践

课程介绍 本课程是世界上第一Spark企业级最佳实践课程,课程包含: Spark的架构设计: Spark编程模型: Spark内核框架源码剖析: Spark的广播变量与累加器: Shark的原理和使用: Spark的机器学习: Spark的图计算GraphX: Spark SQL: Spark实时流处理: Spark程序的测试: Spark的优化: Spark on Yarn: JobServer: 培训对象 1, 云计算大数据从业者: 2, Hadoop使用者: 3,  系统架构师.系统分析师

Spark企业级开发最佳实践

课程介绍 本课程是世界上第一Spark企业级最佳实践课程,课程包含: Spark的架构设计: Spark编程模型: Spark内核框架源码剖析: Spark的广播变量与累加器: Shark的原理和使用: Spark的机器学习: Spark的图计算GraphX: Spark SQL: Spark实时流处理: Spark程序的测试: Spark的优化: Spark on Yarn: JobServer: 最后以一个商业级别的Spark案例为基础,实战展示商业级别Spark项目的架构设计.实现和优化:

转 Web程序优化的最佳实践:Cookie、图片及移动应用篇

[编者按]来自Yahoo!的Exceptional Performance团队为我们带来了改善Web性能的最佳实践方案.为此,他们为此进行了 一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是提高网站性能.通过各种努力,xcetional Performance团队总结出了一系列可以提高网站速度的方法.可以分为 7 大类 34 条.包括内容.服务器.cookie.CSS.JavaScript.图片.移动应用等七部分. 延伸阅读: Web程序优化的最佳实践

规模化敏捷开发的10个最佳实践(上)

[编者按]软件开发和採购人员常常会对现有软件开发方法.技巧和工具产生一些疑问.针对这些疑问,Kevin Fall 整理了五个软件方面的话题:Agile at Scale,Safety-Critical Systems.Monitoring Software-Intensive System Acquisition Programs,Managing Intellectual Property in the Acquisition of Software-Intensive Systems.以及