web网站服务软件
Apache、Nginx、Tomcat 和 IIS 都是流行的 Web 服务器软件,它们各自有不同的特点和应用场景。
四种web服务器软件概述
1. Apache
Apache是世界上最流行的开源Web服务器软件之一,由于其跨平台和安全性被广泛使用。Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,包括Linux、Windows和macOS等。Apache的特点主要包括:
- 简单、速度快、性能稳定:Apache服务器稳定可靠,可以高效地处理大量并发连接。
- 跨平台支持:可以运行在几乎所有广泛使用的计算机平台上。
- 丰富的特性:支持最新的HTTP/1.1通信协议,支持通用网关接口(CGI),支持SSL加密,以及支持基于IP和基于域名的虚拟主机等。
- 可定制性:通过简单的API扩展,可以将Perl/Python等解释器编译到服务器中,使其具备更多的功能。
2. Nginx
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx的特点是:
- 高并发处理能力:能够支持高达50,000个并发连接数的响应,是处理高并发场景的优选。
- 轻量级、资源消耗少:相比其他Web服务器,Nginx在内存和CPU资源消耗上表现更佳。
- 配置简洁:Nginx的配置文件简洁明了,易于上手和管理。
- 广泛的应用场景:不仅可以用作Web服务器,还可以作为反向代理、负载均衡器、HTTP缓存服务器等。
3. Tomcat
Tomcat是一个可靠、灵活且功能强大的servlet容器,主要用于托管Java Web应用程序。它由Apache软件基金会开发,是一个免费的开源项目。Tomcat的特点包括:
- 支持Java Servlet和JSP规范:使得开发人员能够构建动态、交互式的Web应用程序。
- 轻量级、快速启动:Tomcat设计为轻量级,具有快速启动和低资源消耗的特点,适合在资源有限的环境中运行。
- 易于配置和部署:提供了简单的配置和部署机制,降低了开发和维护成本。
- 强大的社区支持:作为Apache软件基金会的项目,Tomcat拥有庞大的社区支持,提供了丰富的文档、教程和社区资源。
4. IIS
IIS(Internet Information Services)是微软公司提供的基于运行Microsoft Windows的互联网基本服务。IIS最初是Windows NT版本的可选包,随后内置在Windows 2000、Windows XP Professional和Windows Server 2003等版本中。IIS的功能包括:
- Web服务器:用于在Internet或Intranet上发布网页和提供Web服务。
- FTP服务器:支持文件传输协议(FTP),允许用户上传和下载文件。
- NNTP服务器:支持网络新闻传输协议(NNTP),用于新闻组服务。
- SMTP服务器:支持简单邮件传输协议(SMTP),用于发送电子邮件。
IIS与Windows Server完全集成,利用Windows Server和NTFS(NT File System)内置的安全特性,建立强大、灵活而安全的Internet和Intranet站点。尽管IIS在某些方面受到其只能运行在Windows平台上的限制,但它仍然是许多Windows环境下Web服务的首选。
Nginx和Apache的区别
Nginx和Apache作为两种流行的Web服务器软件,在多个方面存在显著差异。以下是它们之间的一些主要区别:
- 处理机制:
- Nginx:采用异步非阻塞机制,一个进程可以同时处理多个连接。这种机制使得Nginx在处理高并发连接时表现出色,能够支持大量并发请求而不显著增加系统资源消耗。
- Apache:采用同步阻塞+多进程/多线程模型,一个进程或线程通常只能同时处理一个连接。在高并发场景下,Apache可能需要启动更多的进程或线程来应对,这会增加系统资源的消耗。
- 性能与资源消耗:
- Nginx:由于其轻量级的设计和高效的事件驱动模型,Nginx在处理大量并发连接时能够保持较低的CPU和内存资源消耗。这使得Nginx非常适合用于高流量和高并发的Web服务场景。
- Apache:虽然Apache也是一个功能强大的Web服务器,但在处理高并发连接时,其资源消耗可能会显著增加。特别是在处理大量静态文件请求时,Apache的性能可能不如Nginx。
- 配置复杂度:
- Nginx:Nginx的配置文件相对简洁,易于理解和维护。同时,Nginx支持正则表达式,使得配置更加灵活和强大。
- Apache:Apache的配置文件相对复杂,尤其是对于初学者来说可能较为困难。然而,Apache提供了丰富的配置选项和模块,可以满足各种复杂的Web服务需求。
- 功能与应用场景:
- Nginx:除了作为Web服务器外,Nginx还经常被用作反向代理服务器、负载均衡器以及HTTP缓存服务器。其高效的性能和灵活的配置使得Nginx在多种Web服务场景中都有广泛的应用。
- Apache:Apache也是一个功能全面的Web服务器,支持多种编程语言(如PHP、Python等)和动态内容生成。此外,Apache还提供了丰富的模块和插件,可以扩展其功能和性能。
Nginx的应用场景
- Web网站服务:Nginx可以用作Web网站服务软件,处理HTTP静态页面请求。其高效的性能和稳定性使得Nginx成为许多高流量网站的首选。
- 虚拟主机:Nginx支持虚拟主机功能,可以在一个服务器上部署多个网站站点。这有助于节省服务器资源和成本。
- 反向代理和负载均衡:Nginx可以作为反向代理服务器接收客户端的请求,并将其转发给后端上游服务器进行处理。同时,Nginx还支持负载均衡功能,可以将请求分配到多个后端服务器上以提高系统的整体处理能力和可用性。
- Web缓存服务器:Nginx可以用作Web缓存服务器缓存经常被访问的静态网页资源。这有助于减少后端服务器的负载并提高网站的访问速度。
编译安装Nginx服务
1. 关闭防火墙并传输软件包
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
将 nginx-1.12.0.tar.gz
传输到 /opt
目录。
2. 安装依赖包
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make #nginx的配置及运行需要pcre、zlib、openssl等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
3. 创建运行用户和组
useradd -M -s /sbin/nologin nginx
4. 编译安装Nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \#指定nginx的安装路径
--user=nginx \#指定用户名
--group=nginx \#指定组名
--with-http_stub_status_module#启用 http_stub_status_module 模块以支持状态统计
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/#让系统识别nginx的操作命令
5. 管理Nginx服务
- 检查配置文件:
nginx -t
- 启动Nginx:
/usr/local/nginx/sbin/nginx
- 查看NginxPID号:
cat /usr/local/nginx/logs/nginx.pid
- 停止Nginx:
cat /usr/local/nginx/logs/nginx.pid | xargs kill -QUIT
- 重载配置:
cat /usr/local/nginx/logs/nginx.pid | xargs kill -HUP
- 日志分割:
cat /usr/local/nginx/logs/nginx.pid | xargs kill -USR1
- 平滑升级:
cat /usr/local/nginx/logs/nginx.pid | xargs kill -USR2
新版本升级步骤
- 备份旧版本:
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
- 解压新版本源码:
tar -zxvf nginx-1.xx.xx.tar.gz cd nginx-1.xx.xx
- 重新配置编译选项:
./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module \ --with-http_ssl_module
- 编译新版本:
make
- 替换旧版本二进制文件:
cp objs/nginx /usr/local/nginx/sbin/nginx
- 执行升级:
make upgrade
#要保证当前 nginx 进程是通过 /usr/local/nginx/sbin/nginx 启动的,而不是通过查找环境变量中那个 nginx 命令启动的
#或者先 killall nginx ,再/usr/local/nginx/sbin/nginx
6. 添加Nginx系统服务
方法一:使用init.d脚本
vim /etc/init.d/nginx
脚本内容:
#!/bin/bash
#chkconfig: - 99 20
#description:Nginx Service Control Script
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$COM
;;
stop)
kill -s QUIT $(cat $PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PID)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
设置权限并添加服务:
chmod +x /etc/init.d/nginx
chkconfig --add nginx#添加为系统服务
systemctl stop nginx
systemctl start nginx
方法二:使用systemd服务文件
vim /lib/systemd/system/nginx.service
服务文件内容:
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务
[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户
设置权限并启用服务:
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
认识Nginx服务的主配置文件
- 全局块:全局配置,对全局生效;
- events块:配置影响 Nginx 服务器与用户的网络连接;
- http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
- server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
- location块:用于配置匹配的 uri ;
- upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
vim /usr/local/nginx/conf/nginx.conf
# Nginx主配置文件 nginx.conf
# 1. 全局块
user nobody; # 运行用户,若编译时未指定则默认为 nobody
worker_processes auto; # 工作进程数量,一般设置为和 CPU 核数一样;设置为auto,nginx将自动获取
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID 文件的位置
worker_rlimit_nofile 65535; # 指定 worker 子进程可以打开的最大文件句柄数
# 2. I/O 事件配置
events {
use epoll; # 使用 epoll I/O模型,对于2.6及以上版本的内核推荐使用
worker_connections 65535; # 每个 worker 子进程能够处理的最大并发连接数
multi_accept on; # 尽可能多地接受新连接
accept_mutex on; # 以串行方式接入新连接,避免惊群问题
}
#如提高每个进程的连接数还需执行“ulimit -HSn 65535”命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
#worker_processes的值和work_connections的值决定了最大并发数量,最大并发数计算方式为:worker_processes*worker_connections。但在反向代理场景中计算方法不同,因为nginx既要维持和客户端的连接,又要维持和后端服务器的连接,因此处理一次连接要占用2个连接,所以最大并发数计算方式为:worker_processes*worker_connections/2。
# 3. HTTP 配置
http {
# 文件扩展名与文件类型映射表
include mime.types;
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"';
# 访问日志位置
# access_log logs/access.log main;
# 开启高效的文件传输模式(启用内核复制模式,大幅提高IO效率)
sendfile on;
#开启tcp_nopush和tcp_nodelay用于防止网络阻塞
#必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量(将响应头和正文的开始部分一起发送,而不一个接一个的发送。)
tcp_nopush on;
tcp_nodelay on;
# 连接保持超时时间
keepalive_timeout 65;
# gzip压缩输出(根据需要开启)
# gzip on;
# Web 服务的监听配置
server {
# 监听地址及端口
listen 80;
# 站点域名,可以有多个,用空格隔开
server_name 示例.com www.示例.com;
# 网页的默认字符集
charset utf-8;
# 根目录配置
location / {
# 网站根目录的位置(假设nginx安装在/usr/local/nginx)
root /usr/local/nginx/html;
# 默认首页文件名
index index.html index.php;
}
# 内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/nginx/html; # 假设错误页面也放在这个目录下
}
}
# 如果有更多的server块,可以继续在这里添加
}
# 注意:确保在运行Nginx之前,已正确设置系统的文件句柄限制
# 可以通过命令 `ulimit -HSn 65535` 临时修改(对当前会话有效)
# 或者在 /etc/security/limits.conf 文件中设置永久限制
注意:
server_name
应该被设置为您的网站域名或IP地址。在这里,我使用了“示例.com”作为占位符。- 如果您的Nginx安装目录与
/usr/local/nginx
不同,请相应地修改root
指令中的路径。 - 对于高并发环境,确保您已按照注释中的指示调整了系统的文件句柄限制。
- 开启了
gzip
压缩可以显著提高网站的加载速度,特别是对于大型文件。 error_page
指令配置了Nginx在遇到特定HTTP错误代码时应该返回的页面。在这个例子中,它配置了当服务器遇到500、502、503、504错误时,将显示/50x.html
页面。您需要确保这个文件存在于您指定的根目录中。
补充
日志格式设定:
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
location常见配置指令,root、alias、proxy_pass
root(根路径配置,可以写在 http、server、location 等配置中):root /var/www/html
请求www.xy101.com/test/1.html,会返回文件/var/www/html/test/1.html
alias(别名配置,只能写在 location 中):alias /var/www/html
请求www.xy101.com/test/1.html,会返回文件/var/www/html/1.html
proxy_pass(反向代理配置)
Nginx常用配置
一、访问状态统计配置
- 检查HTTP_STUB_STATUS模块
/usr/local/nginx/sbin/nginx -V cat /opt/nginx-1.12.0/auto/options | grep YES
- 修改nginx.conf
http { ... server { listen 80; server_name www.xy101.com; charset utf-8; location / { root html; index index.html index.php; } location /status { stub_status on; access_log off; } } }
- 重启服务并测试
systemctl restart nginx
二、基于授权的访问控制
- 生成用户密码认证文件
yum install -y httpd-tools htpasswd -c /usr/local/nginx/passwd.db zhangsan chown nginx /usr/local/nginx/passwd.db chmod 400 /usr/local/nginx/passwd.db
- 修改nginx.conf
server { location / { ... auth_basic "secret"; auth_basic_user_file /usr/local/nginx/passwd.db; } }
- 重启服务并测试
nginx -t systemctl restart nginx
三、基于客户端的访问控制
server {
location / {
...
allow 192.168.80.200;
deny all;
}
}
重启服务
systemctl restart nginx
四、基于域名的Nginx虚拟主机
- 域名解析
echo "192.168.80.10 www.xy101.com www.xy102.com" >> /etc/hosts
- 准备网页文档
mkdir -p /var/www/html/{xy101,xy102} echo "<h1>www.xy101.com</h1>" > /var/www/html/xy101/index.html echo "<h1>www.xy102.com</h1>" > /var/www/html/xy102/index.html
- 修改nginx.conf
http { ... server { listen 80; server_name www.xy101.com; root /var/www/html/xy101; ... } server { listen 80; server_name www.xy102.com; root /var/www/html/xy102; ... } }
- 重启服务并测试
systemctl restart nginx
五、基于IP的Nginx虚拟主机
- 配置IP地址
ifconfig ens33:0 192.168.80.11 netmask 255.255.255.0
- 修改nginx.conf
http { ... server { listen 192.168.80.10:80; server_name www.xy101.com; root /var/www/html/xy101; ... } server { listen 192.168.80.11:80; server_name www.xy102.com; root /var/www/html/xy102; ... } }
- 重启服务并测试
systemctl restart nginx
六、基于端口的Nginx虚拟主机
http {
...
server {
listen 192.168.80.10:8080;
server_name www.xy101.com;
root /var/www/html/xy101;
...
}
server {
listen 192.168.80.10:8888;
server_name www.xy102.com;
root /var/www/html/xy102;
...
}
}
重启服务
systemctl restart nginx