nginx学习之安装和配置

nginx 学习笔记之安装和配置

什么是Nginx

nginx是一个高性能的反向代理服务器

正向代理代理的是客户端
反向代理代理的是服务端

安装

以下步骤为编译安装,也可使用yum或者apt进行安装

下载tar包

1
wget http://nginx.org/download/nginx-1.16.1.tar.gz

解压jar包

1
tar -zxf nginx-1.16.1.tar.gz

设置安装目录

1
./configure [--prefix]

此时可能会报缺少某个库的错误,按照提示搜索相应库的安装方法进行安装即可,安装完成后再次运行该命令
–prefix 设置安装目录,若不设置安装目录,则默认的安装信息如下
nginx path prefix: “/usr/local/nginx”
nginx binary file: “/usr/local/nginx/sbin/nginx”
nginx modules path: “/usr/local/nginx/modules”
nginx configuration prefix: “/usr/local/nginx/conf”
nginx configuration file: “/usr/local/nginx/conf/nginx.conf”
nginx pid file: “/usr/local/nginx/logs/nginx.pid”
nginx error log file: “/usr/local/nginx/logs/error.log”
nginx http access log file: “/usr/local/nginx/logs/access.log”
nginx http client request body temporary files: “client_body_temp”
nginx http proxy temporary files: “proxy_temp”
nginx http fastcgi temporary files: “fastcgi_temp”
nginx http uwsgi temporary files: “uwsgi_temp”
nginx http scgi temporary files: “scgi_temp”

编译安装

1
make && make install

相关命令

进入到nginx对应的安装目录下

启动

1
sbin/nginx

停止

1
sbin/nginx -s stop

重新加载配置

配置文件位于安装目录下的conf/nginx.conf 文件中

1
sbin/nginx -s stop

创建软链接

即可直接使用nginx命令,这样就不用每次都进入到nginx安装目录下才能使用nginx命令

1
ln -s /mnt/d/ubuntu/nginx/sbin/nginx /usr/bin/nginx

/mnt/d/ubuntu/nginx/sbin/nginx nginx安装目录下的nginx命令目录
/usr/bin/nginx 对应的用户nginx命令

nginx的配置

nginx在逻辑上将提供不同内容的配置划分为块,这些块以层次结构的形式存在(http->server->location)
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
...              #全局块

events { #events块
...
}

http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。

配置文件详解

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
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。

upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}

几个常见配置项:

1
2
3
4
5
6
7
8
1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
2.$remote_user :用来记录客户端用户名称;
3.$time_local : 用来记录访问时间与时区;
4.$request : 用来记录请求的url与http协议;
5.$status : 用来记录请求状态;成功是200;
6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.$http_referer :用来记录从那个页面链接访问过来的;
8.$http_user_agent :记录客户端浏览器的相关信息;

server

用于定义用于处理已定义类型请求的虚拟服务器(虚拟主机)。通常会配置多个server块,并根据请求的域名,端口和IP地址决定哪个块应该处理哪个连接。

基于ip的虚拟主机

1
2
3
4
5
6
7
8
server {
listen 8080;
server_name 127.0.0.1; # 设置具体ip
location / {
root html;
index index.html;
}
}

基于端口号的虚拟主机

1
2
3
4
5
6
7
8
server {
listen 8080; # 设置具体端口号
server_name localhost;
location / {
root html;
index index.html;
}
}

基于域名的虚拟主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
server_name blog.dxysun.com; # 设置具体域名
location / {
root html;
index blog.html;
}
}
server {
listen 80;
server_name ask.dxysun.com;
location / {
root html;
index ask.html;
}
}

listen指令通常定义 server 块将响应的IP地址和端口。默认情况下,任何不包含listen指令的 server 块默认 listen 在0.0.0.0:80(或者0.0.0.0:8080如果Nginx由普通的非root用户运行),这样的配置块响应80端口上任何接口的请求,但是这个默认值在server选择过程中没有太大的权重。

该listen指令可以设置为:

  • IP地址/端口组合。
  • 只有IP地址,它将监听默认端口80。
  • 只有端口,它将监听该端口上的每个接口。
  • Unix套接字的路径。

在尝试确定向哪个服务器块发送请求时,Nginx将首先尝试listen使用以下规则根据指令的特异性来决定:
Nginx用默认的缺省值来替换所有不完整的lesten指令(完整:IP+port的组合)的缺省值,因此每一个server块的listen指令都可以看作是IP地址和端口的组合。 这种转换的例子有:

  • 没有listen指令的块使用该值0.0.0.0:80。
  • 设置为111.111.111.111没有端口的IP地址的块变为111.111.111.111:80
  • 设置为8888没有IP地址的端口的块变为0.0.0.0:8888

接下来Nginx会尝试去收集一个server块的列表,这个列表是基于具体的IP和端口最佳匹配。也就是说如果匹配的server块有具体的IP地址,它就不会匹配用0.0.0.0作为默认的IP地址的server块。无论什么情况,在Nginx选择server块的过程中,端口必须准确匹配。

如果只有一个最具体的匹配,那么该server块将用于提供请求。如果有多个server 块具有相同层次的具体匹配,那么Nginx需继续评估server_name指令。

需要特别注意的是,只有 listen 指令在同一层次上有多个匹配的 server 块时,Nginx才会继续评估server_name指令。

举个例子,如果域名example.com被解析到IP为192.168.1.10,端口为80的主机上,当客户端请求example.com时,在本例中,第一个server模块总是会提供服务,尽管server_name指令在第二个server模块中。

1
2
3
4
5
6
7
8
9
server{
listen 192.168.1.10;
....
}
server{
listen 80;
server_name example.com;
....
}

多个server模块在具体的匹配中处于同一级别的情况下,Nginx下一步才会检查server_name指令。

location

根据用户请求的url进行匹配
可配置多个

配置规则

1
location [=|~|~*|^~] /uri/ { … }

location = /uri 精准匹配
location ^~ /uri 前缀匹配
location ~* /uri 不区分大小写匹配(可用正则表达式)
location ~ /uri 区分大小写匹配(可用正则表达式)
location !~ /uri 区分大小写不匹配
location !~* /uri 不区分大小写不匹配
location / 通用匹配

规则的优先级

  1. 精准匹配是优先级最高
  2. 普通匹配(最长的匹配)
  3. 正则匹配
    1
    2
    3
    4
    5
    6
    1 location = /
    2 location = /index
    3 location ^~ /article/
    4 location ^~ /article/files/
    5 location ~ \.(gif|png|js|css)$
    6 location /

    http://192.168.11.154/
    http://192.168.11.154/index -> 匹配第 2 条
    http://192.168.11.154/article/files/1.txt -> 匹配第 4 条
    http://192.168.11.154/mic.png -> 匹配第 5 条

alias与root的区别

root 实际访问文件路径会拼接URL中的路径
alias 实际访问文件路径不会拼接URL中的路径

示例如下:
alias 示例

1
2
3
location ^~ /sta/ {  
alias /usr/local/nginx/html/static/;
}

请求:http://test.com/sta/sta1.html
实际访问:/usr/local/nginx/html/static/sta1.html 文件

root 示例

1
2
3
location ^~ /tea/ {  
root /usr/local/nginx/html/;
}

请求:http://test.com/tea/tea1.html
实际访问:/usr/local/nginx/html/tea/tea1.html 文件

实际使用建议

1
2
3
4
5
6
7
8
9
location =/ {  # 设置精准匹配

}
location / { # 设置通用匹配

}
location ~* \.(gif|....)${ # 设置正则匹配

}

Nginx模块

模块分类

  1. 核心模块 ngx_http_core_module
  2. 标准模块 http模块
  3. 第三方模块

如何添加第三方模块

  • 原来所安装的配置,你必在重新安装新模块的时候,加上
    首先执行nginx -V查看安装时的编译参数

    1
    2
    3
    nginx version: nginx/1.16.1
    built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
    configure arguments: --prefix=/mnt/d/ubuntu/nginx

    添加第三方模块重新编译时要把之前编译时的参数带上

  • 不能直接make install

安装方法

1
./configure --prefix=/安装目录 --add-module = /第三方模块的目录

或者

1
./configure --prefix=/data/program/nginx --with-http_stub_status_module --withhttp_random_index_module

之后编译,与编译安装不同的是,不要执行make install

1
2
make
cp objs/nginx $nginx_home/sbin/nginx # 把编译好的文件覆盖原先的nginx二进制文件
打赏

请我喝杯咖啡吧~

支付宝
微信