Nginx 应用
一、概述
Nginx是一个轻量级的HTTP服务器(HTTP Server),当然同样支持SMTP、POP3、IMAP等协议,还有通过模块支持TCP。和Apache一样,都是用来处理和响应用户请求的,最大的区别就是Nginx能支持更大的并发量(单机性能可以达到5w左右的并发)。
Nginx和Tomcat有什么区别?
Tomcat是应用服务器(Application Server) ,用来运行系统程序的服务器,负责处理程序中的业务逻辑,如Tomcat、JBoss、Weblogic。
HTTP 服务器一般是用来访问静态资源,而应用服务器可以动态生成资源内容,比如java的Servlet。当然Nginx也可以通过模块开发提供应用服务器功能,Tomcat也可以直接提供HTTP服务。
通常HTTP服务器和应用服务器一起使用,比如运行多个Tomcat,通过Nginx实现反向代理,负载均衡等,或者把静态资源放在Nginx,动态资源放在Tomcat,实现动静分离。
二、HTTP基础
- IP:是分配给网卡的地址,用来找到网络一台设备,实现通信。
- port:一个设备上运行多个程序,通过端口找到指定的程序,端口范围0-65535(FTP 默认21、HTTP默认80、HTTPS默认443、Mysql默认3306、Redis默认6379、Nacos默认8848)
- 域名:因为ip端口对于用户非常难以识别和记忆,所以发明了域名,因为域名唯一,而且包含特殊含义。
- DNS:浏览器输入域名就会自动转到ip,访问到对应的服务,这个把域名转换IP的系统叫做DNS,域名解析服务。
- url:协议、子域名(www 就是一个约定的二级域名,子域名可以有多级)、域名类型、端口号(不写就是默认端口),后面是资源路径及参数。
HTTP特点:
- 格式简单、通信快速
- 传输数量类型丰富
- 无连接(收到应答后断开连接)
- 无状态(不需要之前的信息)
HTTP请求格式:
- 请求行reques line、请求头header、空行和请求数据body
HTTP响应格式:
- 状态行、消息头、空行和响应正文
请求类型 Request Method:
- GET:请求指定的页面信息,并返回实体主体。
- HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
- POST:向指定资源提交数据进行处理请求,数据被包含在请求体中。
- PUT:从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE:请求服务器删除指定的页面
- OPTIONS:允许客户端查看服务器的性能。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
HTTP响应状态码:
- 1XX:Informational(信息性状态码) 接收的请求正在处理
- 2XX:Success (成功状态码) 请求正常处理完毕
- 3XX:Redirection (重定向状态码) 需要进行附加操作以完成请求
- 4XX:Client Error (客户端错误状态码) 服务器无法处理请求
- 5XX:Server Error (服务器错误状态码) 服务器处理请求出错
三、Nginx 应用
3.1、配置文件
- 1、用“#”表示注释
- 2、每行配置的结尾需要加上分号
- 3、如果配置项值中包括语法符号,比如空格符,那么需要使用单引号或双引号 括住配置项值,否则Nginx会报语法错误
3.2、Nginx常用命令
3.3、Nginx日志
-
log_format:日志格式可以定制 nginx-reverse.conf
-
access_log:指定路径、指定格式及日志压缩
3.4、虚拟主机(Virtual Host)
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
-
1、修改hosts
-
2、创建html文件
-
3、配置文件 nginx-domains.conf
user mengday staff;
http {
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
# 默认location
location / {
root /usr/local/var/www/html;
index index.html index.htm;
}
}
}
访问测试 http://localhost/test.html 指向/usr/local/var/www/html/test.html
注意:如果访问图片出现403 Forbidden错误,可能是因为nginx.conf 的第一行user配置不对,默认是#user nobody;是注释的,linux下改成user root; 然后重新加载配置文件或者重启,再试一下就可以了, 用户名可以通过who am i 命令来查看。
3.5、实现反向代理
反向代理应该是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理通过proxy_pass指令来实现。
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host:$server_port;
# 设置用户ip地址
proxy_set_header X-Forwarded-For $remote_addr;
# 当请求服务器出错去寻找其他服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
}
location匹配规则
优先级:(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)
3.6、负载均衡
负载均衡其意思就是分摊到多个操作单元上进行执行,共同完成任务。如果后端服务器down掉,能自动剔除。默认配置轮询。
负载均衡通过upstream指令来实现。
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
#access_log logs/host.access.log main;
location / {
proxy_pass http://web_servers;
# 必须指定Header Host
proxy_set_header Host $host:$server_port;
}
}
#权重轮询
upstream test {
server localhost:8081 weight=1;
server localhost:8082 weight=3;
server localhost:8083 weight=4 backup;
}
#ip_hash,IP的哈希结果固定选择一个真实服务器
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
# fair(第三方),按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
3.7、代理缓存
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=proxy_cache:10m
inactive=60m max_size=1g;
缓存主动清理:根据URL清理
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
location ~ /purge(/.*){
allow all;
proxy_cache_purge qingshan_cache $host$1$is_args$args;
}
http://192.168.149.47/purge/time/query
3.8、动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
set $doc_root /usr/local/var/www;
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
root $doc_root/img;
}
location / {
proxy_pass http://web_servers;
# 必须指定Header Host
proxy_set_header Host $host:$server_port;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root $doc_root;
}
}
3.9、数据压缩
gzip压缩配置
3.10、跨域访问
后端代码解决跨域问题
@CrossOrigin
"Access-Control-Allow-Origin" : "*"
"Access-Control-Allow-Methods" : "GET,POST,PUT,OPTIONS"
"Access-Control-Allow-Credentials" : "true
Nginx配置解决跨域问题
location / {
proxy_pass http://192.168.44.1:9097;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS';
add_header 'Access-Control-Allow-Header' 'Content-Type,*';
}
3.11、 内置变量
nginx的配置文件中可以使用的内置变量以美元符$开始。
$content_length :请求头中的Content-length字段。
$content_type :请求头中的Content-Type字段。
$document_root :当前请求在root指令中指定的值。
$host :请求主机头字段,否则为服务器名称。
$http_user_agent :客户端agent信息
$http_cookie :客户端cookie信息
$limit_rate :这个变量可以限制连接速率。
$request_method :客户端请求的动作,通常为GET或POST。
$remote_addr :客户端的IP地址。
$remote_port :客户端的端口。
$remote_user :已经经过Auth Basic Module验证的用户名。
$request_filename :当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme :HTTP方法(如http,https)。
$server_protocol :请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr :服务器地址,在完成一次系统调用后可以确定这个值。
$server_name :服务器名称。
$server_port :请求到达服务器的端口号。
$request_uri :包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。