nginx的安装和nginx的几个作用
1.centerOs7上安装nginx
1.1 下载
// 要把ningx下载到linux下的哪目录
cd /usr/local/soft
// 下载
wget http://nginx.org/download/nginx-1.18.0.tar.gz
1.2 解压
tar -xzvf nginx-1.18.0.tar.gz
1.3 安装依赖环境
gcc环境:基本运行环境
pcre:用于nginx的http模块解析正则表达式
zlib:用户进行gzip压缩
openssl:用于nginx https协议的传输
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
1.4 编译安装
–prefix=/usr/local/soft/nginx 的意思是把nginx安装到/usr/local/soft/nginx
所以后面会有一个源码目录nginx-1.18.0,一个编译安装后的目录nginx
cd /usr/local/soft/nginx-1.18.0 ./configure --prefix=/usr/local/soft/nginx
make && sudo make install
cd /usr/local/soft/nginx/
1.5 测试配置是否成功
/usr/local/soft/nginx/sbin/nginx -t -c /usr/local/soft/nginx/conf/nginx.conf
1.6启动Nginx
/usr/local/soft/nginx/sbin/nginx
浏览器输入192.168.1.104 (是linux的i地址)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PLQZP4bg-1610873801353)(C:\Users\张\AppData\Roaming\Typora\typora-user-images\1610866328637.png)]
1.7 copy vimfile
为了让VIM查看nginx配置文件时语法高亮,需要把相应文件copy到VIM目录。
先确定本机的vimfiles目录在哪个位置。
// 查找vimfiles放在哪里了
find / -name vimfiles
cd /usr/local/soft/nginx-1.18.0
cp -r contrib/vim/* /usr/share/vim/vimfiles/
1.8 nginx常用命令
nginx -s reopen #重启Nginx
nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx
nginx -s stop #强制停止Nginx服务
nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -?,-h #打开帮助信息
nginx -v #显示版本信息并退出
nginx -V #显示版本和配置选项信息,然后退出
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -T #检测配置文件是否有语法错误,转储并退出
nginx -q #在检测配置文件期间屏蔽非错误信息
nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)
nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)
nginx -g directives #设置配置文件外的全局指令
killall nginx #杀死所有nginx进程
2.nginx具体的使用
2.1 nginx实现虚拟主机
很多年前还没有阿里云,腾讯云的技术时候,现在有一台服务器,假如每个用户要在这台服务器下想申请一个私人的内存空间用。那这时候就可以使用ningx来实现这个需求。
自己windows机器上的hosts文件配置映射关系
C:\Windows\System32\drivers\etc
192.168.1.104 www.zzg.com www.wangaiai.com
所以在浏览器输入www.zzg.com 和www.wangaiai.com。 先通过hosts映射到了192.168.1.104就是nginx那台机器上。然后通过nginx上的ningx.conf的server_name,root自然就分配到了root指定的目录。这就是用户的私人空间 目录了。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name www.zzg.com; # 用户输入www.zzg.com就可以映射到这了
root /usr/local/soft/nginx/study_data/zzg; #自动映射到了这个文件夹下
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# 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;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
server {
listen 80;
server_name www.wangaiai.com;
root /usr/local/soft/nginx/study_data/wangaiai;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# 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;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 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;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
2.2 nginx实现反向代理
什么是反向代理?
反向代理是针对服务端的,客户端是把nginx当作服务端的,ningx又把请求发到了真实的服务端。
反向代理的ningx的配置
客户端192.168.1.104,输入这个ip,nginx配置文件中 的server_name,和listen自动映射到了nginx(192.168.1.104)的listen的80端口。又通过location 的proxy_pass转发到了真实的服务地址。 http://192.168.1.104:9096;这就是方向代理的实现。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80; #监听80端口
#server_name localhost;
server_name 192.168.1.104;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://192.168.1.104:9096;
proxy_method POST;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#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;
}
}
}
2.3 nginx实现负载均衡
客户端输入192.168.1.104 通过nginx的配置文件中的server_name,listen映射到了nginx这台nginx机器上,
这个请求又被代理到了http://ecif上,upstrem ecif上配置了服务列表。这样就实现了负载均衡。ecif是自己随便起的名字。
upstrem 模块默认算法是权重轮询。它还有一些其他的配置,如最大连接数量等。下面是具体使用的例子。
upstream ecif {
server 192.168.44.1:12673 weight=2 max_fails=3 fail_timeout=15;
server 192.168.44.1:12674 weight=3;
server 192.168.44.1:12675 weight=1;
server 192.168.44.1:12676 down;
server 192.168.44.1:12676 backup;
}
weight: 默认为1,weight值越大,负载的权重越大。比如上面配置的例子中分别为1 2 3.那么请求接受的比例就是
1/6 2/6 3/6。
max_conns:限制分配给某台Server的处理的最大的连接数量,超过这个配置的值,将不会分配给新的连接请求给它了。默认为0,表示不限制。
max_fails: 默认为1,某台Server允许请求失败的次数,超过这个次数后,在fail_timeout时间内,新的请求将不会分配给这个Server机器了。
fail_timeout: 默认为10秒,某台Server达到max_fail、设置的失败次数后,在fail_timeout期间内,nginx会认为这个Server暂时不可以用,这个期间内不会分配给新的请求过来了。
backup: 其他所有非back_up的机器都是down状态,或者是都正在忙的时候,nginx会把请求分配到back_up这台机器上。
默认的负载均衡策略: 1.权重轮询,2.ip_hash(每次相同的客户端请求都会被nginx分配到这台指定的Server上。可以解决session问题。) 3.least_conn(最小连接数)当前活跃连接数越小,权重越大,越被nginx优先选择。
nginx的配置
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream ecif {
fair;
server 192.168.44.1:12673;
server 192.168.44.1:12674;
server 192.168.44.1:12675;
}
server {
listen 80;
server_name 192.168.1.104;
location / {
proxy_pass http://ecif;
}
}
# 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;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}xxxxxxxxxx #user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_connections 1024;}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; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream ecif { fair; server 192.168.44.1:12673; server 192.168.44.1:12674; server 192.168.44.1:12675; } server { listen 80; server_name localhost; location / { proxy_pass http://ecif; } } # 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; # location / { # root html; # index index.html index.htm; # } #}}11
2.4 nginx实现Http缓存
腾讯课堂上有个视频很多用户都要请求这个资源,那么所有的人都去请求,那么后端的压力就大了。可以通过nginx去解决这个问题,资源被访问一次就被缓存在nginx上指定的目录下了,这样其他的请求不会被代理到服务端去请求资源了。
nginx配置文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
#缓存路径/data/nginx/cache缓存结构为2层,即该路径下会有2层子目录,缓存文件会保存在最下层子目录
#缓存的key会保存在名为web_cache的内存区域,该内存区域大小为50m
#10分钟内缓存没有被访问就会过期
#缓存文件最多占用1g空间
proxy_cache_path /usr/local/soft/nginx/study_data/cache levels=1:2 keys_zone=qingshan_cache:50m inactive=10m max_size=1g;
#include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.1.104:9096;
# 缓存使用前面定义的内存区域
proxy_cache qingshan_cache;
proxy_ignore_headers Expires Set-Cookie;
# 对于200和304的响应码进行缓存,过期时间为1分钟,这会覆盖前面定义的10分钟过期时间
proxy_cache_valid 200 304 5m;
# 设置缓存的key,这里用到了nginx的内嵌变量,表示用整个url作 key
#proxy_cache_key $scheme$proxy_host$request_uri;
proxy_cache_key $host$uri$is_args$args;
# 在返回的响应里添加响应头 X-Proxy-Cache,其值表示是否命中了缓存
add_header X-Proxy-Cache $upstream_cache_status;
}
# 缓存清理配置
# location ~ /purge(/.*){
# allow all;
#proxy_cache_purge qingshan_cache $host$1$is_args$args;
}
}
如果这个视频有更新怎么办,在缓存没有过期时间请求的都是这个缓存的数据,那么都是旧的视频数据。
这时候需要通过ngx_cache_purge-2.3.tar.gz第三方的jar去解决这个问题。
2.5 nginx实现动静分离
资源分为动态资源和静态资源,如服务端的java这是动态资源,js,jpg,css(静态资源)等就是把资源分开,提高响应速度。可以把静态资源存储在nginx上,动态资源去服务端去请求。
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.1.104;
location / {
#动态资源去这个服务端去请求
proxy_pass http://192.168.1.104:9096;
}
# 以下静态资源都放在了root下面这个路径下,直接去这个目录下去取。不用去服务端去请求了。
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
# 可以是本机目录页可以是其他服务器,proxy_pass
root /usr/local/soft/nginx/study_data/static;
}
}
}
2.6 nginx实现数据压缩
实现了压缩功能,就可以把访问的资源压缩后给到浏览器。这样就节省了网络消耗及减少了带宽。
gzip on /off; 是否开启gzip压缩。
gzip_comp_level 3; 压缩等级,值是1到9,等级越高CPU消耗越高。设置在3~5较合适。
gzip_disable “MESI [ 1-6] \.” 针对不同客户端发起的请求进行有选择的打开或关闭gzip。禁止IE的6关闭gzip。
gzip_http_version 1.0; 启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)
gzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)
gzip_types text/plain application/xml # 对哪些类型的文件用压缩 如txt,xml,html ,css
gzip_vary on|off # 是否传输gzip压缩标志
nginx配置:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_http_version 1.0;
gzip_comp_level 3;
gzip_types text/plain application/json application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_min_length 1k;
server {
listen 80;
server_name 192.168.1.104;
location / {
proxy_pass http://192.168.1.104:9096;
}
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /usr/local/soft/nginx/study_data/static;
}
}
}
2.7 nginx实现跨域访问
什么是同域: 协议,域名(IP),端口都相同。任何一个不同就是不同域。
在浏览器中有个同源策略,一个域的文档或脚本不允许和另外一个域的资源数据进行交互。
浏览器A 访问服务B 服务B又在后台访问了服务C 服务C把数据发给了服务B ,服务B把数据又给了浏览器A。这时候就是跨域了,就违反了同源策略。
跨域的集中解决方案:
1.修改浏览器配置
2.前段改为JSONP请求,但是它只能解决get请求。
3.服务端C 的代码的Controller加上@CrossOrigin注解,他的原理是在http响应头中加了以下配置
Access-Control-Allow-Origin' '*';
'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
'Access-Control-Allow-Credentials' 'true';
- 服务端添加拦截器,为指定的http请求添加允许跨域的header
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class CORSConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
//registry.addMapping("/time/**"); // 拦截方法中存在time名字的
registry.addMapping("/**")
//.allowedOrigins("*") // 拦截所有的
.allowedOrigins("http://192.168.44.1:9096")// 拦截这个IP端口的
.allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
.allowCredentials(false).maxAge(3600);
}
};
}
}
5.nginx配置的
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
# 添加请求头,解决跨域问题
listen 80;
server_name localhost;
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token';
proxy_pass http://192.168.44.1:9097;
}
}
}