赞
踩
目录
3.nginx的安装部署(基于Centos-stream操作系统)
nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而得到广泛使用。当它用作Web服务器时,相比较于apache,它在处理静态文件方面效率更高,具有高并发、占用资源少的优点。其次它作为反向代理的时候,可以实现负载均衡。本篇文章主要从这两个主要功能来介绍nginx
这里插播一条介绍,nginx一大功能是反向代理,什么是反向代理?而与之相对的正向代理又是什么?两者又有何区别?
正向代理与反向代理部署位置都是在客户端与服务端之间,正向代理代理的是客户端,反向代理代理的是服务端。正向代理可以隐藏客户端信息,解决访问限制的问题,可以用缓存提高访问效率,也可以访问一些正常无法访问的网站(譬如翻墙外网等)。反向代理隐藏服务端网络信息,起到一个安全保护的作用,且可以实现负载均衡。
nginx的安装很简单,这里介绍的是使用yum一键安装所需软件包,然后进行编译安装。所需要安装的软件有:zlib、zlib-devel、pcre、pcre-devel、openssl、openssl-devel、GCC
1、使用如下命令进行安装软件包
yum install -y zlib zlib-devel openssl openssl-devel gcc pcre pcre-devel
2、软件包安装完成后,从以下网站下载nginx的tar包,可自定义下载路径,然后解压
wget http://nginx.org/download/nginx-1.21.6.tar.gz
3、解压命令
tar -zxvf nginx-1.21.6.tar.gz
4、解压后进入nginx-1.21.6目录,由于后续可能需要用到安全认证和状态监控功能,所以可先执行如下命令安装两个模块http_stub_status_module 和http_ssl_module
./configure --with-http_stub_status_module --with-http_ssl_module
5、然后开始安装
make && make install
6、安装完成后,nginx服务默认安装路径在/usr/local/nginx/,如下命令启动nginx服务
/usr/local/nginx/sbin/nginx
7、nginx常用命令
- /usr/local/nginx/sbin/nginx -s reload //重启nginx服务,配置文件修改后重新加载
-
- /usr/local/nginx/sbin/nginx -s stop //停止nginx服务
-
- /usr/local/nginx/sbin/nginx -t //检查nginx配置文件
-
- /usr/local/nginx/sbin/nginx -v //查看nginx版本号
-
- /usr/local/nginx/sbin/nginx -V //查看nginx已经编译的参数,可以看到这里有刚刚安装的两
- 个模块http_stub_status和http_ssl
以下是默认安装的nginx默认配置文件,nginx配置文件路径:/usr/local/nginx/conf/nginx.conf
nginx配置文件最外层的块是main,main包含events块、http块,而http块中有upstream和一个或多个server块,server块中又有一个或多个location块
- //全局配置
- #user nobody; //默认用户,nobody是一个不能登录的用户,只能看到所有人均可读可写的文
- 件,用来完成特定的任务,不能登录是为了安全,防止入侵
- worker_processes 1; //工作进程,nginx一般是一个master进程加一个或多个工作进程,这里定义工
- 作进程数量。该参数一般建议与CPU数量一致
-
- #error_log logs/error.log; //错误日志路径,以下可定义错误日志级别,debug模式日志最详细
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
-
- #pid logs/nginx.pid; //进程id文件,nginx启动时记载进程号的文件
-
-
- events {
- use epoll //定义nginx工作模式,参数有select/poll/epoll/kqueue/等,epoll是
- 高效的网络IO模式,一般在linux系统使用;kqueue一般在FreeBSD系统
- 中使用
- worker_connections 1024; //每个工作进程允许的最大连接数,nginx的最大客户端连接数
- =worker_connections*worker_processes
- }
-
-
- http {
- include mime.types; //引用mime.types文件中的mime类型定义
- default_type application/octet-stream; //定义默认类型为任意的二进制流
-
- #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- # '$status $body_bytes_sent "$http_referer" '
- # '"$http_user_agent" "$http_x_forwarded_for"'; //定义日志文件内容格
- 式,main为此格式名称
-
- #access_log logs/access.log main; //日志文件路径并引用上面定义的名为main的日志格式
-
- sendfile on; //高效文件传输模式开关,提高文件读写效率,一般在做Web服务器时打开开关
- #tcp_nopush on; //sendfile开关打开时使用,用来防止网络堵塞
-
- #keepalive_timeout 0;
- keepalive_timeout 65; //客户端连接保持的超时时间,超出该时间服务端断开与客户端的连接
-
- #gzip on; //压缩打包传输开关
- //一个server块就是一个虚拟主机
- server {
- listen 80; //监听端口,默认80
- server_name localhost; //服务名称ip或者域名
-
- #charset koi8-r; //网页编码格式
-
- #access_log logs/host.access.log main; //日志路径并引用日志格式 main
-
- location / {
- root html; //网页发布文件的根目录
- index index.html index.htm; //网页发布文件
- }
-
- //下面一段额外添加,为nginx作为反向代理时的负载均衡配置,用upstream块实现
- upstream test {
- ip_hash //负载均衡调度算法,默认为Weight轮询,还有ip_hash/url_hash/fair算法
- server 192.168.91.128:80 weight=1; //服务器ip端口配置,Weight轮询算法权重值,值越
- server 192.168.91.128:81 weight=2; 大被分配到的几率越高
- server 192.168.91.128:82 weight=3;
- }
-
- #error_page 404 /404.html;
-
- # redirect server error pages to the static page /50x.html
- #
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- //上面一段配置是指当网页访问报错500/502/503/504时,显示html目录下50x.html文件内容
- # proxy the PHP scripts to Apache listening on 127.0.0.1:80
- #
- #location ~ \.php$ {
- # proxy_pass http://127.0.0.1; //被代理服务器ip
- #}
- //上面三行指做php格式的脚本文件的反向代理
- # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
- #
- #location ~ \.php$ {
- # root html;
- # fastcgi_pass 127.0.0.1:9000;
- # fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- # include fastcgi_params;
- #}
- //nginx支持fastcgi功能
- # deny access to .htaccess files, if Apache's document root
- # concurs with nginx's one
- #
- #location ~ /\.ht {
- # deny all; //用作Web服务器时的访问控制,禁止访问.htxx格式文件
- #}
- }
-
-
- # another virtual host using mix of IP-, name-, and port-based configuration
- #
- #server {
- # listen 8000;
- # listen somename:8080;
- # server_name somename alias another.alias;
-
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
-
-
- # HTTPS server
- #
- #server {
- # listen 443 ssl;
- # server_name localhost;
-
- # ssl_certificate cert.pem;
- # ssl_certificate_key cert.key;
-
- # ssl_session_cache shared:SSL:1m;
- # ssl_session_timeout 5m;
-
- # ssl_ciphers HIGH:!aNULL:!MD5;
- # ssl_prefer_server_ciphers on; //支持ssl安全认证功能
-
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
-
- }
nginx用作Web服务器时,主要关注如下配置
安装完nginx后,启动nginx服务即可用浏览器访问http://localhost:80,有可能会遇到访问被拒绝,该情况下检查防火墙80端口是否被放通,防火墙放通使用如下命令
- firewall-cmd --list-all //查看防火墙所有信息
-
- 也可以分开查看端口和服务信息
- firewall-cmd --list-ports //查看放行端口信息
- firewall-cmd --list-services //查看放行服务信息
-
-
- 若80端口未放行,使用下面命令放行80端口
- firewall-cmd --permanent --add-port=80/tcp
- firewall-cmd --reload //防火墙重新加载策略
-
- 若http服务未放行,使用下面命令放行http服务
- firewall-cmd --permanent --add-services=http
- firewall-cmd --reload //防火墙重新加载策略
防火墙放通后,访问网页如下,表示nginx成功安装
关于修改默认发布文件以及发布目录,此处不再赘述,涉及的修改端口等问题可参考另一篇apache运维笔记讲解:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/124062101
nginx服务器跟apache服务器一样,通过内置模块http_access_module,通过在location块中设置allow和deny来实现IP的访问控制。配置如下
- deny 192.168.91.131;
- allow all;
- //允许除192.168.91.131以外的客户端访问
此时浏览器访问显示连接被拒绝
nginx服务器通过内置模块http_auth_basic_module来实现基于授权的访问控制
1./usr/local/nginx/conf/nginx.conf配置文件中添加如下配置:
- auth_basic "secret";
- auth_basic_user_file /usr/local/nginx/passwd;
2.htpasswd 命令生成用户认证文件,然后根据提示输入test1用户的密码,命令如下:
htpasswd -cm /usr/local/nginx/passwd test1
3.浏览器访问url,此时提示需要输入用户名密码
apache与nginx的访问控制都可以基于ip和授权,两者配置也类似,apache的访问控制配置可参考一下链接:
CSDNhttps://mp.csdn.net/mp_blog/creation/editor/124062101
之前部署apache时用到的ip和端口环境还在,所以我们这里用nginx作为之前安装的apache服务器的反向代理,环境如下:
apache服务器ip :192.168.91.128
端口号:80
界面如下:
配置如下(只需要在location块中加一行proxy_pass:被代理的服务器ip和端口:
- location / {
- # proxy_pass http://192.168.91.128:80; //被代理服务器ip
- }
配置完成后重启nginx服务,然后使用访问http://192.168.91.131:80,返回apache服务器网页发布文件内容
前面讲解配置文件时,提到upstream块,它就是nginx实现负载均衡配置的地方,此处只是最简配置,不涉及参数的修改,配置如下:
- upstream test {
- server 192.168.91.128:80 weight=1;
- server 192.168.91.128:81 weight=2;
- server 192.168.91.128:82 weight=3;
- }
- //配置负载均衡,此处使用默认Weight轮询算法,并分别配置权重值,可见根据配置权重值越大,访问概率越高,第一次访问应该访问的是192.168.91.128:82端口
-
- server {
- listen 8090; //该处为了与上面配置的80端口区分,此处修改为8090端口
- server_name localhost;
-
-
-
- location / {
- proxy_pass http://test;
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
-
- }
- //此处配置负载均衡,此处配置未涉及其它参数更改,基本可以算最简配置,proxy_set_header设置增加文件头,将真实的客户端信息传输到真实服务器上,要不然在真实服务器上收到的客户端信息永远都是代理服务器的ip与主机名。(此处配置了真实ip与主机名)
其中的upstream块中通过一台服务器三个端口来实现多站点访问,此处配置同样可参考:
CSDNhttps://mp.csdn.net/mp_blog/creation/editor/124062101
前面我们安装了http_stub_status_module模块,这里我们可以开启此模块功能,此模块可以统计nginx自上次启动以来工作状态信息,包含连接活跃数,处理响应请求数等信息
开启配置如下:
- location ~ /status {
- stub_status on; //开启状态统计功能
- access_log off; //关闭此模块的日志
- }
成功后访问:http://localhost:8090/status,查看状态统计信息如下:
Active connections:当前活跃连接数
第三行三个数字分别表示:当前总共处理了多少个连接/当前总共成功创建的握手次数/当前总共处理了多少次请求
Reading:表示Nginx读取到客户端Header信息数
Writing:Nginx返回给客户端的Header信息数
Waiting:表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数
nginx在作为Web服务器时,可以高效的处理静态文件,但是它无法处理动态文件,当收到动态文件请求时,需要用到它的反向代理功能将请求转发给后台的tomcat服务器来处理,两者的搭配,既可以实现动态文件的处理,又可以高效的处理静态文件。
nginx实现动静态文件分离主要使用了location块的url匹配功能,简单介绍如下:
(location =) > (location完整url) > (location ^~) > (location ,*) > (lcoaltion部分起始路径) > (/)
location = 开头表示精确匹配
location ^~ 开头表示url以某个常规字符串开头,理解为匹配 url路径即可。
location ~ 开头表示区分大小写的正则匹配
location ~* 开头表示不区分大小写的正则匹配
location !~和location !~*分别为区分大小写不匹配及不区分大小写不匹配的正则
location / 通用匹配,任何请求都会匹配到。
匹配优先级顺序:
首先精确匹配 = ;
其次前缀匹配 ^~;
其次是按照配置文件中的正则匹配;
然后匹配不带任何修饰符的前缀匹配;
最后/通用匹配;
- location / {
- proxy_pass http://x.x.x.x;
- }
- //所有的路径都是/开头,表示匹配所有
- location ~ .*\.(php|php5)?$
- {
- proxy_pass http://x.x.x.x;
- }
- //匹配所有以.php或者.php5的URL, ~表示区分大小写
- location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
- {
- proxy_pass http://x.x.x.x;
- }
- //匹配以.gif,.jpg,.jpeg,.png,.bmp,.swf结尾的url
- location ~ .*\.(js|css)?$
- {
- proxy_pass http://x.x.x.x;
- }
- //匹配以.js或者.css结尾的url
-
上述配置文件表示,匹配上的静态文件分别走相应的代理的url,若都未匹配上则走匹配所有的url
当使用nginx实现负载均衡时,涉及到一个会话保持的问题,即保证同一客户端能够稳定访问后台固定某一台服务器。nginx实现会话保持一般有两种方法,一种是基于ip_hash,另一种是基于cookie。使用ip_hash方法的话会导致负载不均衡,所以一般不推荐;使用基于cookie的方法,需要编译sticky模块,下面对这两种方法做一下介绍
该方法配置如下,基本原理就是将客户端的ip经过hash转换,同一客户端每次转换后的值是固定不变的,nginx根据该转换值将请求分发至某一固定的服务端。
- upstream test {
- ip_hash
- server 192.168.91.128:80;
- server 192.168.91.128:81;
- server 192.168.91.128:82;
- }
- //配置负载均衡算法为ip_hash,该算法通过将某一客户端IP做hash转换,每次访问同一客户端的ip hash转换后的值不变,然后nginx根据该转换后的hash值来固定分配至某一固定服务端
-
- server {
- listen 8090; //
- server_name localhost;
-
-
-
- location / {
- proxy_pass http://test;
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
nginx基于cookie的会话保持需要引入第三方模块sticky,该方法需要浏览器支持cookie,基本原理就是当用户通过nginx访问网站,nginx将请求转发至后台服务器处理,后台处理完成后返回给nginx,nginx会将带有route的cookie返回给客户端,并保存在客户端本地,用户下次访问的时候会将带有route信息的请求发给nginx,nginx根据请求中的route信息来识别分发至上次访问的服务端。
sticky模块的编译安装这里不做赘述,安装完成后配置如下:
- upstream test {
- sticky expires=1h domain=test.cn path=/
- server 192.168.91.128:80;
- server 192.168.91.128:81;
- server 192.168.91.128:82;
- }
- //配置sticky,expires参数代表cookie的有效期,domain表示作用域,path表示作用的url,默认也为/
-
- server {
- listen 8090; //
- server_name localhost;
-
-
-
- location / {
- proxy_pass http://test;
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
当我们在编译nginx时,可根据需要来添加所需要的模块,nginx有哪些常用模块?nginx的各个功能又是由哪些模块来实现的?本章节做简单介绍
查看nginx编译加载了哪些模块命令:
/usr/local/nginx/sbin/nginx -V
http_core_module:nginx核心模块,包含核心的一些http参数,对应nginx配置中http块部分
http_stub_status_module:nginx状态监控模块,可监控nginx工作状态,查看活跃连接数,处理请求数等
http_ssl_module:安全认证模块,用于加密的http链接
http_access_module:访问控制模块,可实现基于IP的访问控制,通过allow、deny参数限制访问
http_auth_basic_module:基于用户的访问控制模块,可实现nginx的账号密码访问
http_log_module:nginx的访问日志模块,以指定的格式记录客户端访问nginx的日志
http_upstream_module:nginx负载均衡模块,实现负载均衡功能
http_gzip_module:实现nginx的压缩功能
http_proxy_module:实现nginx的反向代理功能模块
http_rewrite_module:URL重写功能模块,需要安装pcre包
http_limit_conn_module:用于限制用户的并发连接数以及请求数模块
1、worker_rlimit_nofile
nginx能打开的最大文件句柄数,理论上应该与ulimit -n配置的最大文件数除以工作进程数的取值保持一致,但由于nginx负载不一定均衡,所以一般建议与ulimit -n取值一致
2、worker_processes、worker_cpu_affinity
nginx工作进程数,一般建议与服务器CPU核数保持一致,或者在高并发情况下取CPU核数*2。
nginx配置cpu亲和性,将每个CPU与工作进程绑定,以减少因CPU核切换而造成的性能损耗
3、use epoll
使用epoll(I/O多路复用模型)处理模型。freebsd系统一般采用kqueue,linux一般采用epoll,windows一般采用icop
4、sendfile on
高效的文件传输模式,用sendfile系统调用替代read()和write()函数调用,减少上下文切换的过程,以此提高性能;一般是作为Web服务器时使用
5、client_max_body_size
客户端允许的上传的最大文件尺寸,即客户端请求上传的文件大小不能超过该值
6、gzip
压缩传输,用户请求的数据经过nginx发往客户端前,nginx根据配置的策略进行压缩,以减小发给客户端的请求内容大小,以节约网站出口带宽,同时加快了数据传输速率
7、worker_priority
工作进程优先级,默认值为0,取值范围-20~+19;取值越小优先级越高,但是一般不建议取值低于内核进程nice值-5
8、accept_mutex、accept_mutex_delay
是否开启accept锁,nginx的accept锁是为了解决nginx的惊群问题而提出的解决措施,以此保证一个请求过来时,仅有单个进程对该请求进行处理。
accept_mutex_delay表示nginx处理epoll_wait的最大超时时间,即最多多长时间后另一个进程能够重新获取accept锁
9.server_tokens
隐藏nginx的版本号,防止获悉版本号后,根据版本号查询到当前版本存在的漏洞,以此做出安全攻击
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。