Nginx常用配置【入门级】

title: Nginx常用配置【入门级】
date: 2018年10月22日
categories: 技术
tags: [Nginx]
author: 夏天(tian.xia)
top: false


推荐阅读人群:@nginx零基础的小伙伴们😊

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.

如官网所说:nginx是一个HTTP和反向代理服务器、邮件代理服务器,也是一个通用的TCP/UDP代理服务器,最初由俄罗斯人Igor Sysoev编写。

nginx的功能有很多,本文旨在让零基础的小伙伴可以搭起nginx服务并进行一些常用的配置。

一、nginx安装

  • Homebrew安装:brew install nginx
  • 源码编译安装:可以参考官网,以下是我在服务器上源码安装的过程「环境:CentOS-7」
    • 源码包安装略复杂,其实如果只用到nginx的基本配置,那简单安装就够了,可以略过以下安装步骤直接往后看哦😯
  1. 官网下载nginx源码包
    wget http://nginx.org/download/nginx-1.15.5.tar.gz

  2. 解压
    tar -zxvf /root/Desktop/nginx-1.15.5.tar.gz -C /usr/local/src/

    • tar -C 指定解压目录为 /usr/local/src/
  3. 安装
    正式开始前,编译环境gcc gcc-c++、开发库之类的需要提前装好

  1. 安装gcc gcc-c++yum install -y gcc gcc-c++
  2. 安装pcre:PCRE(Perl Compatible Regular Expressions即perl语言兼容正则表达式),是一个Perl库,包括 perl 兼容的正则表达式库,作用是使nginx支持HTTP Rewrite模块,让nginx能够兼容正则表达式,实现正则匹配。
wget "https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz"
tar -zxvf pcre-8.41.tar.gz -C /usr/local/src/
cd /usr/local/src/pcre-8.41
./configure 
#./configure是源代码安装的第一步,主要作用是对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系
#编译
make
#编译安装
make install 

​ 3) 安装zlib:为了支持gzip压缩。

wget "http://zlib.net/zlib-1.2.11.tar.gz"
tar -zxvf zlib-1.2.11.tar.gz -C /usr/local/src/
cd /usr/local/src/zlib-1.2.11
./configure
make && make install

​ 4) 安装ssl

wget "https://www.openssl.org/source/openssl-1.1.1.tar.gz"
tar -zxvf openssl-1.1.1.tar.gz -C /usr/local/src/
cd /usr/local/src/openssl-1.1.1
./config
make && make install

​ 5) 安装Nginx

cd /usr/local/src/nginx-1.15.5/
./configure --prefix=/usr/local/webserver/nginx --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.1
# --prefix:指定安装路径,指定了路径后就不会一团糟啦
make && make install
  • 安装目录:
    - conf:里面是各种配置文件
    - html:一些页面(404,50X…)
    - logs:日志文件
    - sbin:sbin目录下有一个nginx,代表nginx应用程序,启动nginx时,需要进入sbin目录下,启动sbin目录下的nginx可执行文件

二、nginx的启停

首先进入nginx安装目录cd /usr/local/webserver/nginx/

  1. 启动nginx ./sbin/nginx -c conf/nginx.conf
  • -c 指定配置文件,不指定则使用默认配置文件/usr/local/webserver/nginx/conf/nginx.conf
  1. 重新加载nginx ./sbin/nginx -s reload
  2. 停止nginx ./sbin/nginx -s stop
  3. 验证nginx是否启动 ps -ef | grep nginx

三、配置文件结构

  • 安装完成后,在/usr/local/webserver/nginx/conf目录下有一个默认的配置文件nginx.conf,打开乍一看上去很多内容,我把主要内容抽象出来就明朗很多了,这样一个配置文件就可以满足我们一些简单的功能:
# nginx进程数(最合适的数值是cpu的核数)
worker_processes  1;
# 工作模式与连接数上线
events {
    #设置单个进程最大连接数
    worker_connections  1024;
}
# http服务器配置部分
http {
    # 虚拟主机的配置部分
    server {
        # 监听端口
        listen       8080;
        # 域名(可以有多个,空格隔开)
        server_name  localhost;
        # URL匹配配置部分,支持正则表达式,if条件判断匹配
        location / {
            # 设置网页的根目录
            root   html;
            # 默认首页地址
            index  index.html index.htm;
        }
    server {

    }   
}

图示:


image.png

大致可分如下四部分:
main(全局配置)、server(主机配置)、upstream(负载均衡配置)、location(URL匹配特定位置的配置)。

  • main部分配置的指令将会影响其他所有设置;
  • server部分的配置主要用于指定主机和端口;
  • upstream部分的配置用于负载均衡,设置一系列的后端服务器;
  • location部分的配置用于匹配url;
  • 它们四大块配置的继承关系是:server继承main的,location继承server的,upstream既不继承其他配置也不会被继承。

四、常用配置

以下,是说起nginx,大家脑海中可能会立刻闪现出的一些名词,我就由此入手,说一下如何进行配置:

反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

🌰:
以YouTube为例,由于YouTube的访问量很大,为了一系列目的,他有很多台服务器,这时就需要代理服务器把来自各个客户端的请求(或者客户端通过正向代理服务器发出的请求)代理到某台服务器上。这个中间服务器就是反向代理服务器。反向代理的特点是客户端不知道他最终访问的是哪个服务器。

  • nginx反向代理基础配置:
worker_processes 1;
events {
    worker_connections 1024;
}   
http {
    server {
        listen    80;
        location / {
            #打到这个nginx服务的请求 全被反向代理到https://github.com
            proxy_pass  https://github.com/;
        }
    }
}

提及反向代理,就连带也说一下正向代理吧

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

🌰:vpn就是典型的正向代理
还以YouTube为例,我(也就是客户端)想要访问YouTube,但是由于YouTube被中国国家防火墙拒之门外,我们无法直接访问到。那我们可以翻墙到国外一个可以访问YouTube的服务器,通过这个服务器去访问YouTube ,那这个中间服务器做的就是正向代理。正向代理的特点是服务器端不会知道最初是哪里来访问的。

负载均衡

  • 为什么需要负载均衡?
    服务器访问量越大,压力就越大,甚至会奔溃。为了避免服务器崩溃,采用负载均衡的方式,分担服务器的压力。
  • Nginx负载均衡的实现
    • Nginx是通过反向代理实现负载均衡的。使用nginx实现负载均衡,用户会首先访问到nginx服务器,nginx服务器从服务器集群待选列表中按照某种规则选择一台服务器,将该请求引到这台服务器上
    • Nginx会把服务器集群中崩溃的服务器从待选列表中删除,保证不会分配给用户访问到
    • HTTP upstream模块:nginx服务器的一个重要模块。实现客户端ip和后端ip之间的负载均衡 。从待选服务器列表中选取服务器的方法:默认使用轮询算法。
    • 🌰:touch upstream_demo.conf 写入如下配置
user nobody;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    #设置待负载均衡的服务器列表
    upstream summer {
        #server指令:用来指定服务器的IP地址(后面要写IP地址,而不是域名)支持加参数weight(权重),权重值越大,被访问到的概率就越大,不写weight 权重默认是1
        server 192.168.1.7:80 weight=2;
        server 192.168.1.17:80 weight=1;
    }
    server {
        listen       8080;
        location / {
            # 指定一个服务器列表,要与上面upstream后起的名对应上
            proxy_pass http://summer;
        }
    }
}
  • nginx支持的负载均衡策略:
    1. 轮询(default):每个请求按时间顺序逐一分配到不同的后端服务器。
    2. 加权轮询:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    3. ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    4. fair按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    5. url_hash按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

location

  • 语法:location [ = | ~ | ~* | ^~ ] uri { ... }
  • 作用域:server, location
  • 🌰:
location = / {
    # 精确匹配 / ,主机名后面不能带任何字符串
    [ configuration A ]
}

location / {
    # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
    # 但是最长字符优先匹配
    [ configuration B ]
}

location /documents/ {
    # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
    # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
    [ configuration C ]
}

location ^~ /images/ {
    # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    # 匹配所有以 .gif,.jpg或.jpeg 结尾的请求
    # 然而,所有请求 /images/ 下的图片会被[configuration D]处理
    [ configuration E ]
}
# = 表示精确匹配。如 A 中只匹配根目录结尾的请求,后面不能带任何字符串;
# ^~ 表示uri以某个常规字符串开头,不是正则匹配;
# ~ 表示区分大小写的正则匹配;
# ~* 表示不区分大小写的正则匹配;
# / 通用匹配, 如果没有其它匹配,任何请求都会匹配到。
# 优先级排序: 精确匹配 location =, location完整路径, location ^~, (location ~, location ~*正则匹配的优先级会根据location写的先后顺序) , location 部分前缀匹配, 通用匹配location /

rewrite

  1. rewrite简介
  • rewrite功能:使用PERL标准正则和标志位实现url重写或重定向。
  • 作用域:server, location, if
  • 语法格式:rewrite regex replacement [flag];
  1. flag标志位
  • last : 相当于Apache的[L]标记,表示完成rewrite,将rewrite后的地址重新在server标签执行;
  • break : 停止执行当前虚拟主机的后续rewrite指令集,将rewrite后地址重新在当前的location标签执行;
  • redirect : 返回302临时重定向,通知客户端重定向到rewrtie后面的地址,地址栏会显示跳转后的地址
  • permanent : 返回301永久重定向,通知客户端永久重定向到rewrtie后面的地址,地址栏会显示跳转后的地址
  1. if指令
  • 作用域:serverlocation
  • if指令不支持嵌套,不支持 &&|| 的处理
  • if中可以填入的表达式
    (1)变量名:变量值为空,或者是以0开头的字符串会当作false
    (2)变量比较可以使用=!=
    (3)可以匹配正则表达式,~表示匹配区分大小写 ~* 表示匹配不区分大小写
    (4)!~!~* 表示取反(不匹配),和上一条正好相反
    (5)-f!-f 判断本地可访问的文件是否存在
    (5)-d!-d 判断本地可访问的路径是否存在
    (6)-e!-e 判断本地可访问的文件或路径是否存在
    (7)-x!-x 判断本地可访问的文件是否可执行
    (8)部分正则表达式可以使用模式,模式的取值可以用$1...$n进行取值
    🌰:
if ($request_method = POST) {
    return 405;
} //如果请求方法为POST,则返回状态405(Method not allowed)。

if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.0.1;
} //如果请求的文件名不存在,则反向代理到http://127.0.0.1 。这里的break是停止rewrite检查

if ($args ~ xxx=1234){
    rewrite ^ http://example.com/ permanent;
} //如果query string中包含"xxx=1234",永久重定向到example.com

五、总结

相信看完本文,大家对nginx都有了初步的了解,也可以轻松搭起Nginx服务并进行一些常用的配置了吧。其实Nginx是一个非常轻便好用的工具,对它稍做了解就会发现,工作中的很多事情可以用Nginx解决呢。我就先抛出这块儿砖,希望能引出大佬们对Nginx深层次、多方面的分享 😊

六、参考资料

七、附录:

  1. nginx常用指令:
  • nginx -V 查看版本,以及配置文件地址
  • nginx -v 查看nginx版本
  • nginx -c filename 指定配置文件
  • nginx -h 帮助
  • nginx -s reload|reopen|stop|quit 重新加载配置|重启|停止|退出nginx
  • nginx -t 测试nginx.conf配置是否有语法错误
  1. nginx部分常用变量(ps:想了解全部点这里
  • $args : #这个变量等于请求行中的参数,同$query_string

  • $content_length : 请求头中的Content-length字段。

  • $content_type : 请求头中的Content-Type字段。

  • $document_root : 当前请求在root指令中指定的值。

  • $host : 请求主机头字段,否则为服务器名称。

  • $http_user_agent : 客户端agent信息

  • $http_cookie : 客户端cookie信息

  • $limit_rate : 这个变量可以限制连接速率。

  • $request_method : 客户端请求的动作,通常为GET或POST。

  • $remote_addr: 客户端的IP地址。

  • $remote_port : 客户端的端口。

  • $remote_user : 已经经过Auth Basic Module验证的用户名。

  • $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。

  • $scheme : HTTP方法(如http,https)。

  • $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

  • $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。

  • $server_name : 服务器名称。

  • $server_port: 请求到达服务器的端口号。

  • $request_uri : 包含请求参数的原始URI,不包含主机名。
    🌰:

    以这个url为例:http://localhost:8080/pic/baby/1.png

    • $host:localhost

    • $server_port:8080

    • $request_uri:/pic/baby/1.png

    • $document_root:/var/www/html

    • $request_filename:/var/www/html/pic/baby/1.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341