当前位置:   article > 正文

nginx_nginx epoll

nginx epoll

一.网页的笼统介绍

web服务包括:nginx, apacheck(httpd), tomcat

网页也分为:静态网页(.html,.htm.xml)

                      动态网页(.php,.jsp)

nginx和apache默认解析静态网页

二.为什么要用nginx? nginx和Apache的区别?

1.nginx使用的是epoll模型,是异步非阻塞;

Apache使用的是select模型,是同步阻塞

异步非阻塞主进程开多个子进程(异步),CPU在工作,,默认每个进程可以有1024个连接数
同步阻塞子进程运行时,其他数据需要排队

2.nginx支持负载均衡(既支持4层,又支持7层的)反向代理。配置比Apache简单

3.nginx处理静态要比Apache块,但动态处理能力就不出Apache

三.安装nginx步骤

1.1 安装nginx可以进官网进行下载也可以通过wget命令进行下载

http://nginx.org/download/nginx-1.20.2.tar.gz

[root@localhost ~]# wget http://nginx.org/download/nginx-1.20.2.tar.gz

 1.2 下载完成后开始对包的一系列操作

  1. [root@localhost]# yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
  2. [root@localhost ~]# ls
  3. 123.txt anaconda-ks.cfg nginx-1.20.2.tar.gz
  4. [root@localhost ~]# tar zxf nginx-1.20.2.tar.gz -C /usr/local/nginx #将包解压到/usr/local/nginx
  5. [root@localhost ~]# cd /usr/local/nginx/nginx-1.20.2/ #进入解压包
  6. [root@localhost nginx-1.20.2]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module #对包进行一些列配置
  7. [root@localhost nginx-1.20.2]# make && make install #编译&&安装

  配置包的解释说明

gcc可以编译,c,c++,Ada,Object,c和java等语言
pcre  pcre-devel模块可以使用pcre来解析正则表达式
zlib    zlib-devel提供了多种压缩模式与解压方式
openssl   openssl-devel相当于https加密

 1.3 然后编写启动脚本

vi /etc/init.d/nginx

  1. #!/bin/sh
  2. #
  3. # nginx - this script starts and stops the nginx daemin
  4. #
  5. # chkconfig: - 85 15
  6. # description: Nginx is an HTTP(S) server, HTTP(S) reverse \
  7. # proxy and IMAP/POP3 proxy server
  8. # processname: nginx
  9. # config: /usr/local/nginx/conf/nginx.conf
  10. # pidfile: /usr/local/nginx/logs/nginx.pid
  11. # Source function library.
  12. . /etc/rc.d/init.d/functions
  13. # Source networking configuration.
  14. . /etc/sysconfig/network
  15. # Check that networking is up.
  16. [ "$NETWORKING" = "no" ] && exit 0
  17. nginx="/usr/local/nginx/sbin/nginx"
  18. prog=$(basename $nginx)
  19. NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
  20. lockfile=/var/lock/subsys/nginx
  21. start() {
  22. [ -x $nginx ] || exit 5
  23. [ -f $NGINX_CONF_FILE ] || exit 6
  24. echo -n $"Starting $prog: "
  25. daemon $nginx -c $NGINX_CONF_FILE
  26. retval=$?
  27. echo
  28. [ $retval -eq 0 ] && touch $lockfile
  29. return $retval
  30. }
  31. stop() {
  32. echo -n $"Stopping $prog: "
  33. killproc $prog -QUIT
  34. retval=$?
  35. echo
  36. [ $retval -eq 0 ] && rm -f $lockfile
  37. return $retval
  38. }
  39. restart() {
  40. configtest || return $?
  41. stop
  42. start
  43. }
  44. reload() {
  45. configtest || return $?
  46. echo -n $"Reloading $prog: "
  47. killproc $nginx -HUP
  48. RETVAL=$?
  49. echo
  50. }
  51. force_reload() {
  52. restart
  53. }
  54. configtest() {
  55. $nginx -t -c $NGINX_CONF_FILE
  56. }
  57. rh_status() {
  58. status $prog
  59. }
  60. rh_status_q() {
  61. rh_status >/dev/null 2>&1
  62. }
  63. case "$1" in
  64. start)
  65. rh_status_q && exit 0
  66. $1
  67. ;;
  68. stop)
  69. rh_status_q || exit 0
  70. $1
  71. ;;
  72. restart|configtest)
  73. $1
  74. ;;
  75. reload)
  76. rh_status_q || exit 7
  77. $1
  78. ;;
  79. force-reload)
  80. force_reload
  81. ;;
  82. status)
  83. rh_status
  84. ;;
  85. condrestart|try-restart)
  86. rh_status_q || exit 0
  87. ;;
  88. *)
  89. echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
  90. exit 2
  91. esac

1.4  将文件加执行权限  chmod +x

       完成之后检查一下:/sbin/chkconfig nginx on

2.1  然后就可以访问nginx界面了:

四.nginx配置文件

1.nginx重要配置文件有:

confignginx配置文件
htmlnginx的网页文件
logs日志文件
sbinnginx启动文件

2.nginx的配置文件部分

        全局部分:Worker_Process  1;  ##子进程的古树,最好不要大于主机cpu的内核数量

                       还可以添加:         PID文件                启动用户组

        events配置部分:写的是每个进程最大能处理的客户端连接数

                                可以指定epoll模型

        http部分:http例可以包含多个server{        一个server可以包含多个location{

}         }(一个server可以代表一个主机)

        

include   mine.types可以解析的类型,后面是文件名,文件里面是各种类型
default_type默认类型
sendfile  no;零拷贝
keepalive_time 超时时间,默认65秒断开
listen   80默认监听端口号
server name localhost一般为域名
location 匹配文件夹中根下找index等文件
error_page500 502 503 504,状态码,返回这些值就找/50x.html

3.nginx访问日志

head -1 access_log先拿一行最新的访问日志

显示:

  1. 183.202.144.5 - - [13/Apr/2022:14:55:46 +800] "GEI/HTTP/1.1"200 30" -" Moailla/5.0(windows
  2. NT 6.1;win64;x64;rv;74.0)Gecko/20100101 Firefox/74.0
  3. #客户端ip
  4. 第一个"-"是邮箱编号
  5. 第二个"-"是用什么用户登录的
  6. 后面是时间:2022年14时55分46秒 +800在东八区
  7. GET意思是用户登录是为了下载
  8. HTTP请求的协议
  9. "200 30" 200是状态码,30为包的大小
  10. 后面就是Windows系统 win64位
  11. Firefox使用火狐访问的

4.nginx日志的格式是从哪里来呢?

打开nginx.config文件,就可以看到:

  1. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  2. # '$status $body_bytes_sent "$http_referer" '
  3. # '"$http_user_agent" "$http_x_forwarded_for"';
  4. #access_log logs/access.log main;
  5. 192.168.100.222 - - [10/May/2022:08:30:30 +0800] "GET / HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.39"
$remote_addr客户端的ip地址
-客户端的邮箱
$remote_user客户端登录服务器时用到的用户名
[$time_local]显示本地的时间
$requestGET(显示传输方式)以及传输协议
$status显示网站的状态码 
$body_bytes_sent 传输包的大小
$http_refererhttp上⼀级页⾯, 防盗链(相当于从其他网站拿到的图片无法显示,那这个图片就是使用了防盗链)、⽤户⾏为分析
$http_user_agent

客户端的电脑信息,什么系统,多少位,用的什么浏览器访问的

$http_X_forwarded_for

http请求携带的http

虽然上面的数据被加上了#号,但是这些属于注释,默认它已经被执行了

5.如果想查看那些地区访问量最高,进行一个前十名的统计

cat access_log | awk '$1' |sotr -rn |uniq -c |sotr -rn |head -10

五.使用nginx的模块,或者nginx.conf进行扩展实验

        1.使用nginx.conf进行创建虚拟主机

                1.1 在nginx里的HTML文件中创建两个文件夹----benet----accp

                1.2 打开nginx.conf文件

  1. server{
  2. listen 80 ;
  3. server_name www.benet.com; #创建的域名
  4. location / {
  5. root html/benet/; #在html文件下查找benet文件
  6. index index.html index.htm;
  7. }
  8. }
  9. server{
  10. listen 80 ;
  11. server_name accp; #创建的域名
  12. location / {
  13. root html/accp/; #在html文件下查找accp文件
  14. index index.html index.htm;
  15. }
  16. }

创建两个文件并写上两个网页文件

mkdir /uer/local/nginx/html/benet              mkdir /uer/local/nginx/html/accp

vim /usr/local/nginx/html/benet/index.html                vim /usr/local/nginx/html/accp/index.html

然后重启服务 systemctl restart nginx

进入主机的C盘查找C:\Windows\System32\drivers\etc\hosts文件然后指定域名

 然后各自访问一次www.benet.com和www.accp.com

        2.Nginx下载站点

                Nginx默认是不允许列出整个⽬录浏览下载。如果只是单纯的往html文件中添加压缩文件,网页就会报错,那该怎么才能达到一堆压缩文件都显示在网页呢?

        2.1 我们已经将文件放入html

              但是访问网页会报错,403是没有权限 

         2.2 所以开始修改conf文件,咱们在location里面添加一个autoindex on;模块,这次显示文件了!

         2.3 但是好像看不懂啊,咱们再添加一个charset utf-8,gbk;,非常nice它显示文字了,这些文件有多大呢?还是看不明白

         2.4 继续再加一个autoindex_exact_size off | on 

                默认为on, 显示出⽂件的确切⼤⼩,单位是bytes

                修改为off,显示出⽂件的⼤概⼤⼩,单位是kB或者MB或者GB

                 我感觉还是off好使

        2.5 已经写了这么多了,再加一个可以吧,这次好像就剩时间了autoindex_localtime on | off

                默认为off,显示的⽂件时间为GMT时间

                修改为on, 显示的⽂件时间为⽂件的服务器时间(这个是文件上传的时间)

     

                这次我选择on

                3.nginx访问限制

limit_conn_module

模块可以限制nginx服务器所承载的单个客户端单个ip地址在单一时间所发起的连接数量

limit_req_module

模块可以限制nginx服务器所承载的单个客户端单个ip地址在单一时间所发起的请求数量;

3.1高连接没法实验,因为我没有那么多的主机或虚拟机进行实验

3.2使用高请求进行试验:

  1. limit_req_zone $binary_remote_addr zone=req_zone:10m rate=30r/m; #先进行定义,req请求,
  2. #zone区域限制请求的区域
  3. #$binary_remote_addr客户端的地址
  4. #zone=req_zone:10m限制的区域
  5. #rate=30r/m;设置每分钟最大30次,相当于两秒统一访问一次
  6. server{
  7. listen 80 ;
  8. server_name localhost;
  9. location / {
  10. limit_req zone=req_zone; #引用上面的定义,在哪个网站,就写在哪个网站下
  11. root html;
  12. index index.html index.htm;
  13. }
  14. }

怎么验证呢?

我们安装一个:yum -y install http-tools,然后开始测试

  1. [root@bogon html]# ab -n 1000 -c 100 http://192.168.100.202/
  2. Benchmarking 192.168.100.202 (be patient) #100100个的发送
  3. Completed 100 requests
  4. Completed 200 requests
  5. Completed 300 requests
  6. Completed 400 requests
  7. Completed 500 requests
  8. Completed 600 requests
  9. Completed 700 requests
  10. Completed 800 requests
  11. Completed 900 requests
  12. Completed 1000 requests
  13. Finished 1000 requests
  14. Concurrency Level: 100
  15. Time taken for tests: 0.069 seconds #用了0.069
  16. Complete requests: 1000 #发送了1000个请求
  17. Failed requests: 999 #接受了1个请求

                4.nginx访问控制(拒绝某一个ip或网段)|(进入网站时需要用户密码验证)

                4.1只拒绝一个ip或者网段

  1. location / {
  2. root html;
  3. index index.html index.htm;
  4. deny 192.168.100.222;
  5. allow all; ####只拒绝192.168.100.222一个ip,其他全部允许
  6. allow 192.168.100.0/24;
  7. deny all; ####只允许一个网段,其他全部拒绝
  8. ######################记得systemctl restart nginx

               http_access_module局限性(限制客户端ip)

                4.2 让用户登录网站自动弹出账号密码

  1. [root@bogon html]# htpasswd -c /usr/local/nginx/passwd/users zhangsan
  2. ###创建一个文件,里面专放用户的用户名和密码
  3. ###########然后编辑nginx.conf文件
  4. location / {
  5. auth_basic "Auth access Blog Input your Passwd!";
  6. auth_basic_user_file /usr/local/nginx/passwd/users; ###指定用户和密码的文件在哪里
  7. root html;
  8. index index.html index.htm;
  9. }
  10. }

 重启服务后就可以看到:

              

5.nginx进行反向代理

5.1 location和proxy_pass都带/,则真实地址不带location匹配目录

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location /api/ { #访问192.168.100.203下的api时
  5. proxy_pass http://192.168.100.202/; #将把网页跳转到http://192.168.100.202/
  6. root html;
  7. index index.html index.htm;
  8. }

http://192.168.100.203/api/upload/------->http://192.168.100.202:/upload/

5.2 location不带/,proxy_pass带/,则真实地址会带/

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location /api {
  5. proxy_pass http://192.168.100.202/;
  6. root html;
  7. index index.html index.htm;
  8. }

http://192.168.100.210/api/upload/------->http://127.0.0.1:8080//upload/http://192.168.100.203/api/upload/------->http://192.168.100.202://upload/

http://192.168.100.210/api/upload/------->http://127.0.0.1:8080//upload/

5.3 location带/,proxy_pass不带/,则真实地址会带location匹配目录/api/

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location /api/ {
  5. proxy_pass http://192.168.100.202;
  6. root html;
  7. index index.html index.htm;
  8. }

http://192.168.100.203/api/upload/------->http://192.168.100.202/api/upload/

5.4 location和proxy_pass都不带/,则真实地址会带location匹配目录/api/

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location /api {
  5. proxy_pass http://192.168.100.202;
  6. root html;
  7. index index.html index.htm;
  8. }

http://192.168.100.203/api/upload/------->http://192.168.100.202/api/upload/ 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号