Nginx基础配置

Posted 礁之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx基础配置相关的知识,希望对你有一定的参考价值。

一、nginx基础配置

(1)配置文件

******(1)做基础配置
[root@Centos7 ~]# hostnamectl set-hostname rzy
[root@Centos7 ~]# su 
[root@rzy ~]# systemctl stop firewalld
[root@rzy ~]# setenforce 0
setenforce: SELinux is disabled
[root@rzy ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上

******(2)上传Nginx源码包,进行安装
[root@rzy ~]# yum -y install pcre-devel zlib-devel  #安装前提软件
。。。。。。
完毕!
[root@rzy ~]# ll
总用量 1020
-rw-------. 1 root root    1264 1月  12 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 1039530 4月  21 23:48 nginx-1.18.0.tar.gz
[root@rzy ~]# tar xf nginx-1.18.0.tar.gz  -C /usr/src/
[root@rzy ~]# cd /usr/src/nginx-1.18.0/
[root@rzy nginx-1.18.0]# useradd -M -s /sbin/nologin  nginx
[root@rzy nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install 
[root@rzy nginx-1.18.0]# cd
[root@rzy ~]# cd /usr/local/nginx/conf/
[root@rzy conf]# cp nginx.conf nginx.conf.bak #做一个配置文件的备份
[root@rzy conf]# ll | grep nginx.conf  #确认备份成功
-rw-r--r-- 1 root root 2656 4月  21 23:51 nginx.conf
-rw-r--r-- 1 root root 2656 4月  21 23:52 nginx.conf.bak
-rw-r--r-- 1 root root 2656 4月  21 23:51 nginx.conf.default
[root@rzy conf]# sed -i '/#/d' nginx.conf  #删除包含#的行
[root@rzy conf]# sed -i '/^$/d' nginx.conf  #删除空行
[root@rzy conf]# vim nginx.conf 
  1 worker_processes  1;    #工作进程,这个要和本机cpu核心的个数保持一致
  2 events {     #event区域,这个区域还可以指定nginx使用的IO模型,使用use指定,默认为epoll
  3     worker_connections  1024;  #表示每个进程可以处理的最大连接数量,即tcp连接
  4 }
  5 http {   #http区域,即网站区域
  6    include       mime.types;  
  7     default_type  application/octet-stream;
  8     sendfile        on;   #零拷贝,默认开启
  9     keepalive_timeout  65;  #长连接的超时时间,以秒为单位
 10     server {   #虚拟主机区域
 11         listen       80;   #监听的端口
 12         server_name  localhost;   #指定域名
 13         location / {   #location资源区域,指定用户访问什么资源时生效什么配置,location /即根,默认匹配,即用户不管访问什么资源都生效
 14             root   html;   #指定存放网页的路径,默认是html,这是一个相对路径,实际路径就是Nginx的安装目录下的html
 15             index  index.html index.htm;  #指定默认访问的首页文件
 16         }
 17         error_page   500 502 503 504  /50x.html;  #指定错误代码,当状态码为指定的数字时,就重定向到指定的网页
 18         location = /50x.html {  #指定用户访问的资源,=为精确匹配
 19             root   html;  #指定存放的目录
 20         }
 21     }
 22 }

个人理解

  • 配置文件中,以{}来分为各种不同的区域,每个区域分别生效每个区域的配置,那么不在区域中的配置也就是{}外的配置就是main全局配置,即不管用户做什么事情全局配置都生效,常用的就是http{}网站区域,而http{}中又包含server{}虚拟主机区域,每个server{}都是一个虚拟主机,在server{}中,又包含了location{}资源区域,当用户访问location指定的资源时,location{}中的配置才会生效。

  • 每一个区域都有着相应的嵌套关系,例如http{}中的配置会对每个server{}区域生效,当然也对每个server{}中的location{}区域生效,而只在server{}区域中的配置,只有对location{}生效,对http{}不生效

  • 嵌套关系:main全局配置——http{}——server{}——location{}


(2)Nginx日志配置

******(1)继续上面的进度,优化Nginx命令,配置网页内容
[root@rzy ~]# ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/  #优化nginx命令执行路径
[root@rzy ~]# vim /usr/lib/systemd/system/nginx.service   #编写Nginx的启动脚本
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
[root@rzy ~]# systemctl start nginx
[root@rzy ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3749/nginx: master  
[root@rzy ~]# echo "aaaa" > /usr/local/nginx/html/index.html  #编写页面
[root@rzy ~]# curl 127.0.0.1 #访问本地
aaaa

******(2)使用curl命令查看http的请求和返回
[root@rzy ~]# curl -v http://127.0.0.1  #  >就是请求报文,<就是返回报文
* About to connect() to 127.0.0.1 port 80 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1     #依次是请求方式GET, 请求资源 /  ,请求使用的协议 HTTP/1.1
> User-Agent: curl/7.29.0  #请求的方式,这里一般是浏览器的版本,curl就是我们刚才使用的curl工具
> Host: 127.0.0.1   #访问的目的ip
> Accept: */*
> 
< HTTP/1.1 200 OK    #依次是返回使用协议HTTP/1.1 ,状态码200 ok
< Server: nginx/1.18.0  #返回的服务器的web版本
< Date: Wed, 21 Apr 2021 16:24:36 GMT  #返回报文的时间
< Content-Type: text/html  #返回的数据类型
< Content-Length: 5  #返回数据的大小(字节数)
< Last-Modified: Wed, 21 Apr 2021 16:23:15 GMT #最近一次服务器修改配置文件的日期
< Connection: keep-alive  #连接模式,keep-alive长连接
< ETag: "60805173-5"
< Accept-Ranges: bytes
< 
aaaa  #具体的数据
* Connection #0 to host 127.0.0.1 left intact

******(3)在主配置文件中配置日志的区域,因为在写配置文件的时候,把#号开头的注释行和空行删除了,所以需要看一下之前备份的配置文件
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf.bak 
。。。。。。
 20 
 21     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 22     #                  '$status $body_bytes_sent "$http_referer" '
 23     #                  '"$http_user_agent" "$http_x_forwarded_for"';
 24 
 25     #access_log  logs/access.log  main;
 26 
。。。。。。
#想要使用只需要把这些21到25行去掉#注释然后复制到正常使用的nginx.conf中的http{}区域中即可,这些都是nginx的内建变量,下面是解释:
$remote_addr:客户端的地址
$remote_user:http客户端请求nginx认证用户
$time_local:Nginx的时间
$request:请求行,有GET、Post等方法,HTTP协议的版本
$status:返回的状态码
$body_bytes_sent:从服务器响应给客户端body的信息大小
$http_referer:上一级页面,可以通过这个做防盗链、用户行为分析
$http_user_agent:头部信息,客户端访问使用的设备
$http_x_forwarded_for:请求携带的http,通过这个可以使用代理时也能知道客户端的真实ip

二、Nginx常用优化

(1)Nginx状态监控

  • 必要的模块:–with-http_stub_status_module

- 可以配置在主配置文件的区域:server、location

******(1)继续上面的进度,修改配置文件
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf  #在server区域添加一个新的location
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  localhost;
 13         location / {
 14             root   html;
 15             index  index.html index.htm;
 16         }
 17         location /aaa {
 18             stub_status on;
 19             access_log off;
 20         }
 21         error_page   500 502 503 504  /50x.html;
 22         location = /50x.html {
 23             root   html;
 24         }
 25     }
 26 }
#保存退出
[root@rzy ~]# nginx -s reload  #重载nginx,使修改的配置文件生效
[root@rzy ~]# curl 127.0.0.1/aaa #访问本地,指定刚才配置了状态监控的资源
Active connections: 1   #当前活跃连接数
server accepts handled requests
 3 3 3 #依次表示,总共接受的TCP连接次数,处理的TCP连接次数,总共的请求数量,当第一个和第二个不相同时,可以使用第二个减去第一个得到失败tcp连接次数
Reading: 0 Writing: 1 Waiting: 0 

(2)Nginx配置下载站点

  • 当我们访问一下软件的官网,比如Nginx的官网,里面可以看到很多目录并且资源包都是点一下就可以下载,Nginx的官网就是一个下载站点

- 注意:Nginx默认是不允许列出整个目录和下载的

- 可以配置的区域:http,server,location

******(1)继续上面的进度,修改配置文件
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  localhost;
 13         location / {
 14             root   html;
 15             autoindex on;  #开启下载站点
 16         }
 17      }  
 28 }    
[root@rzy ~]# cd /usr/local/nginx/html/ 
[root@rzy html]# nginx -t #测试nginx语句是否正确
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@rzy html]# systemctl restart nginx  #重启服务
[root@rzy html]# rm -rf index.html    #删除原本的网页
[root@rzy html]# mkdir aaa   #创建两个目录,上传一个资源
[root@rzy html]# mkdir bbb
[root@rzy html]# mv /root/nginx-1.18.0.tar.gz .
[root@rzy html]# ll
总用量 1024
-rw-r--r-- 1 root root     494 4月  21 23:51 50x.html
drwxr-xr-x 2 root root       6 4月  22 02:22 aaa
drwxr-xr-x 2 root root       6 4月  22 02:22 bbb
-rw-r--r-- 1 root root       5 4月  22 00:23 index.html
-rw-r--r-- 1 root root 1039530 4月  21 23:48 nginx-1.18.0.tar.gz

使用浏览器访问:

在这里插入图片描述

但是发现最右边的大小不容易换算,继续修改配置文件

 [root@rzy html]# vim /usr/local/nginx/conf/nginx.conf 
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  localhost;
 13         location / {
 14             root   html;
 15             autoindex on;     #开启下载站点
 16             autoindex_exact_size off; #显示文件大小的格式,off可以显示单位,on开启直接以bytes比特为默认单位
 17         }
 18      }
 19 }
[root@rzy html]# nginx -t #测试nginx语句是否正确
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@rzy html]# systemctl restart nginx #重启nginx服务

再次使用浏览器访问

在这里插入图片描述

(3)Nginx访问限制

  • 使用的模块:(ngxin默认已经安装)
limit_conn_module这个模块可以限制访问Nginx的客户端在单一时间可以发起的TCP连接数量(单个客户端、单个ip地址)
limit_req_module这个模块可以限制访问Nginx的客户端在单一时间可以发起的HTTP请求数量(单个客户端,单个ip地址)

  • http协议的连接和请求流程:

在这里插入图片描述


  • HTTP协议的连接和请求
HTTP协议版本连接关系
HTTP1.0TCP连接不能多次使用
HTTP1.1TCP可以按顺序多次使用
HTTP2.0TCP可以多次使用,多路复用

-可以配置的区域:http,server,location

******(1)继续上面的进度,查看Nginx内置是否有这两个模块
[root@rzy ~]# cd /usr/src/nginx-1.18.0/
[root@rzy nginx-1.18.0]# ll
总用量 764
drwxr-xr-x 6 1001 1001    326 4月  21 23:50 auto
-rw-r--r-- 1 1001 1001 302863 4月  21 2020 CHANGES
-rw-r--r-- 1 1001 1001 462213 4月  21 2020 CHANGES.ru
drwxr-xr-x 2 1001 1001    168 4月  21 23:50 conf
-rwxr-xr-x 1 1001 1001   2502 4月  21 2020 configure
drwxr-xr-x 4 1001 1001     72 4月  21 23:50 contrib
drwxr-xr-x 2 1001 1001     40 4月  21 23:50 html
-rw-r--r-- 1 1001 1001   1397 4月  21 2020 LICENSE
-rw-r--r-- 1 root root    376 4月  21 23:51 Makefile
drwxr-xr-x 2 1001 1001     21 4月  21 23:50 man
drwxr-xr-x 3 root root    174 4月  21 23:51 objs
-rw-r--r-- 1 1001 1001     49 4月  21 2020 README
drwxr-xr-x 9 1001 1001     91 4月  21 23:50 src
[root@rzy nginx-1.18.0]# cat auto/options  | grep "HTTP_LIMIT_CONN=YES"  #查看是否有模块
HTTP_LIMIT_CONN=YES
[root@rzy nginx-1.18.0]# cat auto/options  | grep "HTTP_LIMIT_REQ=YES" #查看是否有模块
HTTP_LIMIT_REQ=YES

******(2)测试conn限制TCP连接的模块
[root@rzy nginx-1.18.0]# vim /usr/local/nginx/conf/nginx.conf #修改配置文件
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     limit_conn_zone $binary_remote_addr zone=conn_zone:10m; #同一时刻只允许一个客户端连接
 11     server {
 12         listen       80;
 13         server_name  localhost;
 14         location / {
 15             root   html;
 16             limit_conn conn_zone 1;  #统一时刻只允许一个客户端连接
 17         }
 18      }
 19 }
[root@rzy nginx-1.18.0]# yum -y install httpd-tools #安装ab压力测试工具
。。。。。。
完毕!
[root@rzy nginx-1.18.0]# cd
[root@rzy ~]# cd /usr/local/nginx/html/
[root@rzy html]# ll
总用量 1020
-rw-r--r-- 1 root root     494 4月  21 23:51 50x.html
drwxr-xr-x 2 root root       6 4月  22 02:22 aaa
drwxr-xr-x 2 root root       6 4月  22 02:22 bbb
-rw-r--r-- 1 root root 1039530 4月  21 23:48 nginx-1.18.0.tar.gz
[root@rzy html]# echo "1111" > index.html
[root@rzy html]# curl 127.0.0.1
1111
[root@rzy html]# systemctl restart nginx
#因为一次TCP可以进行多次请求,所以是测试不了的

******(3)测试req限制http请求的模块
[root@rzy html]# vim /usr/local/nginx/conf/nginx.conf
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     limit_req_zone $binary_remote_addr zone=req_zone:10m rate=30r/m; #限制速率,每秒最多30个请求
 11     server {
 12         listen       80;
 13         server_name  localhost;
 14         location / {
 15             root   html;
 16             limit_req zone=req_zone ; #指定req模块的区域为req_zone和上面的相同
 17         }
 18      }
 19 }
[root@rzy html]# systemctl restart nginx
[root@rzy html]# ab -n200 -c20 http://127.0.0.1/index.html  #进行测试
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests


Server Software:        nginx/1.18.0
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /index.html
Document Length:        5 bytes

Concurrency Level:      20
Time taken for tests:   0.007 seconds
Complete requests:      200
Failed requests:        199   #失败199就表示测试成功了,因为每秒请求最多30个,因为所用时间就0.007秒,只成功了一个
   (Connect: 0, Receive: 0, Length: 199, Exceptions: 0)
Write errors:           0
Non-2xx responses:      199
Total transferred:      73665 bytes
HTML transferred:       39208 bytes
Requests per second:    29779.63 [#/sec] (mean)
Time per request:       0.672 [ms] (mean)
Time per request:       0.034 [ms] (mean, across all concurrent requests)
Transfer rate:          10711.51 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     0    0   0.1      0       1
Waiting:        0    0   0.1      0       0
Total:          0    1   0.1      1       1

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      1
  95%      1
  98%      1
  99%      1
 100%      1 (longest request)

-连接限制和请求限制那个更加有效:

同一时刻只允许一个连接,和只允许一个请求,虽然都是一个,但是一个连接可以接受多个请求,而一个请求就是一个请求,所以说限制请求比限制连接更加有效

(4)Nginx访问控制

  • 使用的模块:
http_access_module基于IP的访问控制
http_auth_basic_module基于用户登录认证
  • 可以配置的区域:http.server,location,limit_except
******(1)继续上面的进度,修改配置文件(基于ip的)
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  localhost;
 13         location / { 
 14             root   html;
 15             index index.html;
 16             deny 192.168.100.230;  #拒绝100.230地址
 17             allow all;             #允许所有
 18         }
 19      }
 20 }
[root@rzy ~]# systemctl restart nginx

使用100.230进行访问,发现报错403权限被拒绝,配置基于ip的访问控制成功

在这里插入图片描述

基于客户端ip进行访问控制的局限性:

被拒绝的客户端可以使用代理进行访问,web服务器虽然可以找到代理服务器的ip地址,但是不知道是不是被拒绝的ip进行代理的。但是可以通过显示真实ip去显示真实的客户端ip

******(2)配置基于用户登录的访问控制,创建用户
[root@rzy ~]# htpasswd -c /usr/local/nginx/conf/auth_conf rzy
New password: 
Re-type new password: 
Adding password for user rzy
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  localhost;
 13         location / {
 14             root   html;
 15             index index.html;
 16             auth_basic "请输入你的用户名和密码";
 17             auth_basic_user_file /usr/local/nginx/conf/auth_conf;
 18         }
 19      }
 20 }
[root@rzy ~]# systemctl restart nginx

使用浏览器再次进行访问,配置成功

在这里插入图片描述

(5)Nginx虚拟主机

  • 和apache相同,有三种方式,即基于ip、基于端口、基于域名,因为域名使用的最多,所以只做基于域名的
******(1)每个server{}都是一个虚拟主机,所以只需要创建多个server就可以实现
[root@rzy ~]# vim /usr/local/nginx/conf/nginx.conf #修改配置文件
  1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  www.aaa.com;  #不同域名
 13         location / {
 14             root   html/aaa;
 15             index index.html;
 16         }
 17      }
 18     server {
 19         listen       80;
 20         server_name  www.bbb.com;
 21         location / {
 22             root   html/bbb;
 23             index index.html;
 24         } 
 25      }
 26 }
[root@rzy ~]# cd /usr/local/nginx/html/
[root@rzy html]# mkdir aaa
[root@rzy html]# mkdir bbb
[root@rzy html]# echo "aaaaa" >aaa/index.html
[root@rzy html]# echo "bbbbb" >bbb/index.html
[root@rzy html]# systemctl restart nginx #重启服务

在本地写hosts文件
在这里插入图片描述

进行访问

在这里插入图片描述

配置完成!

以上是关于Nginx基础配置的主要内容,如果未能解决你的问题,请参考以下文章

Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段

[vscode]--HTML代码片段(基础版,reactvuejquery)

Nginx配置文件详细介绍

Nginx 跨域

Nginx简介与基础配置

Nginx的配置