一、了解什么是nginx?
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
特点:支持高并发、占用内存少、跨平台、配置简单
二、为什么要用nginx(通俗)?
1.动静分离:当我们的项目部署到服务器上,想要去访问那些静态资源,怎么访问?通过ip和资源地址肯定是拿不到的。这个时候我们就用nginx,去映射那个路径,然后访问nginx,这个时候它就会去访问我们在里面配置的地址,然后就可以拿到我们的资源。
2.反向代理:访问资源的时候,我们直接访问nginx,然后它会去帮我们找相应的服务器,至于是哪个服务器我们不知道,但是它会合理去查找分配
3.正向代理
4.负载均衡
三、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;
sendfile on;
keepalive_timeout 65;
server {
listen 800;
server_name localhost:8080;
location / {
proxy_pass http://localhost:8080/springm_war_exploded/;
}
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8000;
server_name locahost;
location / {
root html;
index index.html index.htm;
}
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
worker_connections:这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约
events块:events 块涉及的指令,主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。上述例子就表示每个 work process 支持的最大连接数为 1024.
http全局块:http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块:这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
location 块:一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。
index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
下面的error_page是代表错误的页面,先不用它。
proxy_pass:它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。这里我转发的是一个我本地启动的tomcat项目
(这里也就是说我们访问本地的locahost:80,nginx会转到localhost本地下的html文件夹中的index.html去)
四、nginx解决跨域问题
同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域;
Nginx实现跨域原理:Nginx作为代理服务器,通过转发客户端请求实现客户端与服务端在一个域中。
server {
listen 3002;
server_name localhost;
location /ok {
proxy_pass http://localhost:3000;
# 指定允许跨域的方法,*代表所有
add_header Access-Control-Allow-Methods *;
# 预检命令的缓存,如果不缓存每次会发送两次请求
add_header Access-Control-Max-Age 3600;
# 带cookie请求需要加上这个字段,并设置为true
add_header Access-Control-Allow-Credentials true;
# 表示允许这个域跨域调用(客户端发送请求的域名和端口)
# $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号
add_header Access-Control-Allow-Origin $http_origin;
# 表示请求头的字段 动态获取
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
# OPTIONS预检命令,预检命令通过时才发送请求
# 检查请求的类型是不是预检命令
if ($request_method = OPTIONS){
return 200;
} } }
五、配置静态文件
user www www; #指定nginx worker进程运行用户及用户组
worker_processes 2; #设置进程数,每个Nginx进程平均耗费10M~12M内存。建议指定和CPU的数量一致即可
error_log /usr/local/nginx/logs/nginx_error.log crit; #日志位置和日志级别,日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少
pid /usr/local/nginx/nginx.pid; #指定进程pid的存储文件位置
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535; #设置Nginx进程文件句柄数
events
{
use epoll; #指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。
worker_connections 65535; #定义Nginx每个进程的最大连接数
}
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'; #定义日志格式,所支持的全部变量可以在官方文档里查询
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k; #指定来自客户端请求头的headerbuffer大小
large_client_header_buffers 4 32k; #指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“32K”为大小,最大缓存量为4个32K
client_max_body_size 8m; #设置允许客户端请求的最大的单个文件字节数
sendfile on; #开启高效文件传输模式
tcp_nopush on; #设置为on用于防止网络阻塞
keepalive_timeout 60; #设置客户端连接保持活动的超时时间
tcp_nodelay on; #设置为on用于防止网络阻塞
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模块设置
gzip on; #表示开启GZIP压缩,实时压缩输出数据流
gzip_min_length 1k; #设置允许最小压缩文件大小
gzip_buffers 4 16k; #表示申请4个单位为16K的内存作为压缩缓冲区
gzip_http_version 1.0; #设置识别HTTP协议版本
gzip_comp_level 2; #指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源
gzip_types text/plain application/x-javascript text/css application/xml; #指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的
gzip_vary on; #选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据
#开启限制IP连接数的时候需要使用
#limit_zone crawler $binary_remote_addr 10m;
#配置代理
upstream tomcat {
server 127.0.0.1:8081 weight=10;
server 127.0.0.1:8082 weight=10;
server 127.0.0.1:8083 weight=10;
}
#虚拟主机的配置
server
{
listen 80;#监听端口
server_name g06702;#域名
index index.html index.htm index.php;
root /usr/local/nginx/html;#站点目录
# 配置代理路径
location /docker{
proxy_pass http://tomcat/;
}
# 对“/”路径转发 /docker
location = / {
return 302 /docker;
}
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
root /usr/local/static;#路径
expires 30d; #指定静态文件的过期时间
# access_log off;
}
location ~ .*\.(js|css)?$
{
expires 15d; #JS和CSS缓存时间设置
# access_log off;
}
access_log off;
}
}
**
写到这里,博主懒得写了,因为看到下方的链接基本写的非常详细了,自愧不如。所以上给哪些还没找到最全面的讲解的人。所有的从安装到每一句配置讲解,请参考以下博客,写的非常好,只需要看这一篇就够了:
**