运维web服务器
运维web服务器
Web服务器介绍
Web服务器是一种运行于互联网上的计算机硬件或软件,用于存储、处理和传输网页和其他网站内容。
它通常运行在服务器上,绑定服务器的IP地址并监听某一个TCP端口,接收来自客户端的请求,然后向客户端发送所请求的网页或相关资源。
Web服务器通常通过HTTP(超文本传输协议)或HTTPS(加密的HTTP)与客户端进行通信,并使用域名系统(DNS)来将网址转换为IP地址,以便正确定位和访问所请求的网页。
Web服务器的主要功能
接收请求:Web服务器监听特定的网络端口,等待客户端发起HTTP请求。一旦收到请求,它会解析请求的内容,包括请求的URL、HTTP方法、请求头等。
处理请求:服务器根据请求的内容,决定如何处理该请求。它可以根据URL路由请求到不同的处理程序或处理逻辑,也可以执行静态文件的读取和发送。
生成响应:Web服务器根据处理请求的结果,生成HTTP响应。响应包括HTTP状态码、响应头和响应体。响应体可以是HTML页面、JSON数据、文件等。
发送响应:Web服务器将生成的HTTP响应发送回客户端。它使用网络协议(如TCP/IP)将响应发送给客户端,并确保数据的正确传输。
保持连接:Web服务器可以保持与客户端的持久连接,以便处理多个请求。这可以提高性能和效率,减少网络开销。
常用Web服务器
Apache是目前世界上使用最多的Web服务器,市场占有率达60%左右。它是一个开源软件,可以运行在几乎所有的Unix、Linux、Windows系统平台上。Apache的优势在于其开源代码开放,功能丰富,支持动态内容生成、CGI脚本、SSL和TLS等。然而,它也有缺点,即消耗的内存较高。
Nginx是一个轻量级的Web服务器,也可以作为反向代理服务器和负载均衡器使用。它具有高性能和高并发处理能力,常用于高流量的网站和服务。Nginx的优点是资源消耗低,适合处理高负载的网站和应用程序。
Microsoft IIS是微软公司开发的Web服务器,主要用于Windows操作系统。它提供了强大的特性和控制,如ASP.NET支持、FTP、SMTP、虚拟主机和安全认证等。IIS的特点包括安全性、强大和灵活。
Tomcat是一个用于Java应用程序的开源Web服务器,通常与Apache一起使用。它技术先进、性能稳定,深受Java爱好者的喜爱。Tomcat适合运行Java Web应用,具有高性能和稳定性。
Lighttpd是一个轻量级的Web服务器,适用于低系统资源的服务器运行环境下。它具有高性能和高可扩展性,适合处理高负载的网站和应用程序。Lighttpd的特点包括快速、安全、内存开销低,可以在多种操作系统上运行。
安装tomcat
通过以下命令可以看到系统自带的JDK版本信息,看是否为OpenJDK version,
java -version
查询本机中已经安装过的java rpm包,命令如下;
rpm -qa |grep java
rpm -e --nodeps xx
创建一个java目录
mkdir -p /home/local/java
下载Oracle JDK安装包,解压到对应的文件夹
tar -zxvf jdk-8u271-linux-x64.tar.gz
用vim或vi 打开/etc/profile 文件
vim /etc/profile
添加jdk内容
export JAVA_HOME=/home/local/java/jdk1.8.0_151 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
重新加载配置文件,命令:
source /etc/profile
Apache(httpd)和Tomcat对比
共同点:
两者都是Apache组织开发的; 两者都有HTTP服务的功能; 两者都是免费的。
不同点:
Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等),而Tomcat是Apache组织在符合Java EE的JSP、Servlet标准下开发的一个JSP服务器。
Apache是一个Web服务器环境程序,启用它可以作为Web服务器使用,不过只支持静态网页,如(ASP,PHP,CGI,JSP)等动态网页的就不行。如果要在Apache环境下运行JSP的话就需要一个解释器来执行JSP网页而这个JSP解释器就是Tomcat。
Apache:侧重于HTTPServer,Tomcat:侧重于Servlet引擎,如果以Standalone方式运行,功能上与Apache等效,支持JSP,但对静态网页不太理想。
Apache是Web服务器,Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。
实际使用中Apache与Tomcat常常是整合使用:如果客户端请求的是静态页面,则只需要Apache服务器响应请求。
如果客户端请求动态页面,则是Tomcat服务器响应请求。因为JSP是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销。可以理解Tomcat为Apache的一种扩展。
Nginx介绍
Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
和apache一样,都是web服务器软件,因为其性能优异,所以被广大运维喜欢。
又因为nginx是一个轻量级的web服务器,相比apache来说资源消耗更低。
延伸版本:tengine(淘宝)、openresrt(章亦春)等
-
nginx 官网
-
http://www.nginx.cn/doc/index.html 中文文档
为什么选择Nginx
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。
能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。
Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器。
Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。
Nginx和Apache对比
-
静态文件处理能力:nginx高于apache
-
资源消耗:nginx优于apache,因为nginx是异步处理模型,只需要几个进程就能够处理大量在线请求,而apache 2.4仍然是进程模型或者线程模型,即仍然采用大量线程来处理大量在线请求。
-
Apache支持的模块很多,而且也比较稳定。而nginx由于出现的比较晚,所以在这方面可能比不上Apache。
-
nginx本身就是一个反向代理服务器,而且支持7层负载均衡。
-
nginx处理动态页面很鸡肋,一般只用与处理静态页面和反向代理。
nginx源码下载
官网:nginx
源码包: nginx-1.19.3.tar.gz
源码包下载: wget http://nginx.org/download/nginx-1.19.3.tar.gz -P /usr/src
nginx安装
2.1、下载nginx源码包 [root@root ~]# wget http://nginx.org/download/nginx-1.19.3.tar.gz -P /usr/src [root@root src]# cd /usr/src2.2、安装nginx依赖包 [root@root ~]# yum -y install gcc pcre-devel zlib-devel- gcc: 源码编译工具 - pcre-devel: nginx url_rewrite 功能提供包 - zlib-devel: nginx 压缩功能提供包 2.3、解压nginx源码,并进入源码包 [root@root src]# tar xf nginx-1.19.3.tar.gz [root@root src]# cd nginx-1.19.32.4、配置nginx源码[root@root nginx-1.19.3]# ./configure --prefix=/usr/local/nginx配置目的:1)检查环境 是否 满足安装条件 依赖解决2)指定安装方式 配置文件 命令文件 各种文件放哪里 开启模块功能【内置模块 三方模块】3)指定软件安装在那里2.5、编译nginx源码 [root@root nginx-1.19.3]# make -j42.6、安装nginx [root@root nginx-1.19.3]# make install
nginx相关目录
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 path prefix: "/usr/local/nginx":这是Nginx安装的基础目录前缀。通常情况下,Nginx的所有相关文件(如二进制文件、配置文件、日志等)都会基于这个基础目录组织。nginx binary file: "/usr/local/nginx/sbin/nginx":这是Nginx的可执行二进制文件的位置。当你需要启动、停止或重新加载Nginx服务时,就是通过这个文件来操作的。nginx modules path: "/usr/local/nginx/modules":这里是Nginx模块存放的地方。Nginx模块用于扩展Nginx的功能,比如增加对某种协议的支持或是添加新的功能特性。nginx configuration prefix: "/usr/local/nginx/conf":这是Nginx配置文件所在的目录前缀。所有与配置相关的文件通常都放在这个目录下。nginx configuration file: "/usr/local/nginx/conf/nginx.conf":这是Nginx的主要配置文件。通过修改这个文件,你可以调整Nginx的工作方式,包括设置服务器块(虚拟主机)、定义端口监听、指定错误页面等。nginx pid file: "/usr/local/nginx/logs/nginx.pid":这是一个存储Nginx主进程ID的文件。在管理Nginx服务时,这个PID文件可能会被用到,例如发送信号给Nginx进程以进行重启或关闭操作。nginx error log file: "/usr/local/nginx/logs/error.log":这是Nginx记录错误信息的日志文件。当Nginx遇到问题时,可以查看此文件来诊断问题。nginx http access log file: "/usr/local/nginx/logs/access.log":这是Nginx记录访问请求的日志文件。它记录了所有客户端请求的信息,是分析网站流量和用户行为的重要数据来源。nginx http client request body temporary files: "client_body_temp":这是Nginx处理客户端请求体时使用的临时文件目录。如果请求体较大,Nginx会将这部分数据暂时存储在这个目录下的文件中。
nginx相关命令
命令 | 描述 |
---|---|
/usr/local/nginx/sbin/nginx | 启动 Nginx 服务 |
/usr/local/nginx/sbin/nginx -s stop | 快速关闭 Nginx(立即停止) |
/usr/local/nginx/sbin/nginx -s quit | 正常关闭 Nginx(等待工作进程完成当前任务后关闭) |
/usr/local/nginx/sbin/nginx -s reload | 在不中断服务的情况下重新加载配置文件 |
/usr/local/nginx/sbin/nginx -t | 测试配置文件语法,但不启动服务器 |
/usr/local/nginx/sbin/nginx -t -c /path/to/nginx.conf | 使用指定的配置文件测试语法 |
/usr/local/nginx/sbin/nginx -v | 查看 Nginx 版本信息 |
添加自定义nginx.service文件,用systemctl启动服务
手动创建nginx.service服务文件。并将其放入 /lib/systemd/system 文件夹中。
PID文件是一个存储进程标识符(Process ID,简称PID)的文本文件,通常用于守护进程(后台服务程序)。
当一个服务启动时,它会将自己的进程ID写入到一个指定的PID文件中。
这个文件通常位于系统的
/var/run/
目录下或者在服务自身的安装或配置目录内。
vim /usr/lib/systemd/system/nginx.service[Unit] Description=nginx After=network.target[Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true[Install] WantedBy=multi-user.target
注意上面的ExecStart/ExecReload/ExecStop 必须以自己的为主
说明Description:描述服务 After:描述服务类别[Service]服务运行参数的设置 Type=forking 是后台运行的形式 ExecStart 为服务的具体运行命令 ExecReload 为重启命令 ExecStop 为停止命令 PrivateTmp=True 表示给服务分配独立的临时空间注意:[Service]的启动、重启、停止命令全部要求使用绝对路径[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3systemctl start nginx.service (启动nginx服务) systemctl stop nginx.service (停止nginx服务) systemctl enable nginx.service (设置开机自启动) systemctl disable nginx.service (停止开机自启动) systemctl status nginx.service (查看服务当前状态) systemctl restart nginx.service (重新启动服务) systemctl list-units --type=service (查看所有已启动的服务)
完成tomcat的systemctl配置
[Unit] Description=Tomcat After=network.target[Service] Type=forking Environment="JAVA_HOME=/home/local/java/jdk1.8.0_151" PIDFile=/home/local/java/apache-tomcat-9.0.105/logs/catalina.pid ExecStart=/home/local/java/apache-tomcat-9.0.105/bin/catalina.sh start ExecStop=/home/local/java/apache-tomcat-9.0.105/bin/catalina.sh stop[Install] WantedBy=multi-user.target
tomcat没有自带的pid文件,需要找到 catalina.sh
文件,添加内容:
# 设置PID文件位置 CATALINA_PID="/home/local/java/apache-tomcat-9.0.105/logs/catalina.pid"
更新 tomcat.service
配置
[Unit] Description=Tomcat After=network.target[Service] Type=forking Environment="JAVA_HOME=/home/local/java/jdk1.8.0_151" PIDFile=/home/local/java/apache-tomcat-9.0.105/logs/catalina.pid ExecStart=/home/local/java/apache-tomcat-9.0.105/bin/catalina.sh start ExecStop=/home/local/java/apache-tomcat-9.0.105/bin/catalina.sh stop Restart=on-failure[Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl restart tomcat
==如有错误可以尝试删除pid文件==
nginx启动测试
nginx安装完毕,接下来就可以启动nginx了,nginx启动后如何测试nginx的启动状态呢?
可以通过以下三种方式去测试,这个可以根据自己的习惯选择一种测试就行了。
使用netsata命令查看启动端口 [root@root ~]# netstat –ntpl使用losf命令查看启动端口 [root@root ~]# lsof -i :80使用文本浏览器访问nginx默认网站 [root@root ~]# curl http://IP
nginx配置文件
nginx的配置文件是用于定义nginx服务器行为的关键文件,它包含了多个区块和指令,用于控制如何响应客户端的请求。
序号 | 指令名称 | 所属配置块 | 描述说明 |
---|---|---|---|
1 | http | 主配置块 | 设置影响整个 Nginx HTTP 服务的全局参数 |
2 | server | http 块内 | 定义一个虚拟主机(站点),包括监听端口、域名等 |
3 | location | server 块内 | 匹配 URL 路径并定义处理方式,如静态文件、代理、重定向等 |
4 | upstream | http 块内 | 定义后端服务器组,用于负载均衡和故障转移 |
5 | events | 主配置块 | 设置 Nginx 的事件处理模型,如连接数限制、多路复用机制等 |
6 | http2 | server 块内 | 开启或关闭对 HTTP/2 协议的支持 |
7 | gzip | http/server 块 | 启用或配置 Gzip 压缩以减小传输体积 |
8 | access_log | http/server/location 块 | 定义访问日志路径及格式 |
9 | error_log | http/server 块 | 定义错误日志路径及级别 |
10 | proxy_pass | location/upstream 块 | 将请求转发到指定的后端服务器(反向代理) |
11 | root / alias | location/server 块 | 指定静态文件根目录(root 和 alias 行为不同) |
12 | index | http/server/location 块 | 定义默认索引文件名(如 index.html) |
13 | client_max_body_size | http/server/location 块 | 限制客户端请求体的最大大小(常用于上传限制) |
14 | keepalive_timeout | http/server 块 | 设置长连接超时时间 |
15 | cache | http/server/location 块 | 设置缓存策略,如缓存目录、缓存时间等 |
16 | rewrite | server/location 块 | 实现 URL 重写规则,可用于 SEO 或跳转逻辑 |
17 | return | server/location 块 | 直接返回指定的 HTTP 状态码和可选的重定向地址 |
18 | try_files | location 块内 | 检查文件是否存在,如果不存在则尝试其他路径或执行内部跳转 |
19 | error_page | http/server/location 块 | 自定义特定状态码的错误页面(如 404、500 页面) |
20 | load_module | 主配置块 | 加载动态模块(Nginx 1.9.11+ 支持动态模块加载) |
21 | worker_processes | 主配置块 | 设置 Nginx 工作进程数量,通常设为 CPU 核心数 |
22 | worker_connections | events 块内 | 设置每个工作进程最大并发连接数 |
23 | sendfile | http/server/location 块 | 启用或关闭高效的文件传输模式(适合静态文件加速) |
以上只是nginx配置文件中常见的一部分选项和指令。
nginx的配置非常灵活,可以根据实际需求进行调整和优化。
在修改配置文件之前,建议先备份原始文件,以防出现不可预料的问题。
同时,每次修改配置文件后需要重新加载或重启nginx服务使更改生效。
以下是一个简单完整的nginx配置文件示例:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid;events {worker_connections 1024; }http {gzip on;gzip_types text/plain text/css application/json application/javascript;server {listen 80;server_name example.com;root /var/www/html;index index.html;location / {try_files $uri $uri/ =404;}location /api {proxy_pass http://backend;}error_page 404 /404.html;error_page 500 502 503 504 /50x.html;}upstream backend {server backend1.example.com;server backend2.example.com;} }
这个配置文件包含了一个简单的HTTP服务器,监听在80端口上。它使用gzip压缩来减少传输文件的大小。
服务器的根目录是/var/www/html
,默认索引文件是index.html
。
当请求的URL匹配到/api
时,会将请求转发到名为backend
的后端服务器组。
同时,它还定义了自定义的错误页面,用于处理404和5xx错误。
默认网站
server {listen 80;server_name localhost;location / {root html;index index.html index.htm;#支持目录浏览autoindex on;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
访问控制
location /a {autoindex on;allow 192.168.66.0/24;deny all;#基于客户端IP做过滤,符合条件的允许访问,不符合的返回404;if ( $remote_addr !~ "192.168.66.138" ) {#return 404;return http://www.baidu.com;}}
登陆验证
location /c {auth_basic "登陆验证";auth_basic_user_file /etc/nginx/htpasswd; }
为了设置这个文件,你需要使用一个叫做 htpasswd 的工具,它是 Apache 软件基金会提供的一个实用程序,但也可以与 Nginx 一起使用。
sudo yum install httpd-tools
安装 htpasswd 工具
sudo yum install httpd-tools
使用 htpasswd
命令来创建一个新的 htpasswd 文件并添加用户。
创建一个新文件(如果文件不存在)并将名为 username
的用户的加密密码添加到 /etc/nginx/htpasswd
文件中。
sudo htpasswd -c /etc/nginx/htpasswd username
日志管理
Nginx访问日志主要有两个参数控制
log_format #用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)
access_log #用来指定日至文件的路径及使用的何种日志格式记录日志
access_log logs/access.log main;
log_format格式变量:$remote_addr #记录访问网站的客户端地址$remote_user #远程客户端用户名$time_local #记录访问时间与时区$request #用户的http请求起始行信息$status #http状态码,记录请求返回的状态码,例如:200、301、404等$body_bytes_sent #服务器发送给客户端的响应body字节数$http_referer #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。$http_user_agent #记录客户端访问信息,例如:浏览器、手机客户端等$http_x_forwarded_for #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置
自定义一个json格式的访问日志
log_format main_json '{"@timestamp":"$time_local",' '"client_ip": "$remote_addr",' '"request": "$request",' '"status": "$status",' '"bytes": "$body_bytes_sent",' '"x_forwarded": "$http_x_forwarded_for",' '"referer": "$http_referer"' '}'; access_log logs/access_json.log main_json;
防盗链
location /images/ {alias /usr/local/nginx/html/img/;valid_referers none blocked *.baidu.com;if ($invalid_referer) {rewrite ^/ http://192.168.66.146/b.jpeg;#return 403;} }