nginx 使用配置知识

启动nginx:
service nginx start
启动后观察进程信息:
ps aux | grep nginx,得到结果:
root      3630  0.0  0.0   7892   684 ?        Ss   02:24   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     3631  0.0  0.1   8052  1484 ?        S    02:24   0:00 nginx: worker process                  
root      3647  1.0  0.0   4356   728 pts/1    S+   02:26   0:00 grep nginx
从上面信息,我们看到nginx的启动命令实际为:
/usr/sbin/nginx -c /etc/nginx/nginx.conf
其中/usr/sbin/nginx是nginx程序 -c是选取配置文件 /etc/nginx/nginx.conf配置文件路径
打开文件/etc/nginx/nginx.conf:
vi /etc/nginx/nginx.conf, 我们看到:
user  nginx;
worker_processes  1;                                                                                                           

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

}
在http参数中,我们发现了一个特殊的词语:include,其含义是,除了本配置文件之外,还有一些配置信息写在了其他被“include”过的文件中,最重要的是这句: 
include /etc/nginx/conf.d/*.conf;
这句话的意思是/etc/nginx/conf.d/目录下面的所有以conf为后缀名的文件都被http因为配置项,我们要设置自己的配置,只需要在本目录下面创建一个后缀名为conf的文件,添加配置项。
于是我在该目录下创建了文件myserver.conf,其内容如下:
server {
     listen     80;   // 监听端口
     server_name  localhost; // 监听地址
     location / {
            root   /usr/share/nginx/html;   // 根目录位置
            index  index.html index.htm; // 作为默认页的页面文件
     }
 
}
 
配置好设置后,可以启动nginx,实验一把了
service nginx restart
现在去浏览器上面访问服务器ip,结果:
奇怪!
通过排查发现:权限问题,注意nginx.conf中有这样一句话:
user  nginx;
意思是,当前开启nginx程序的用户是nginx用户,而我的目录/usr/share/nginx/html属于root用户,显然权限不够,于是把上面那句话修改为:
user  root;
在root用户登录状态下执行:
service nginx restart
现在访问IP就一切正常了
 
设置反向代理:
在myserver.conf中添加如下配置:
location / {
     proxy_pass    http://10.100.212.66:8088/;
     proxy_redirect default ;
}
这时相当于nginx代理了http://10.100.212.66:8088/的服务
访问nginx服务器ip相当于访问http://10.100.212.66:8088/
 
负载均衡:
假设我现在有三个服务器其IP分别为:
10.100.134.1
10.100.134.2
10.100.134.3
 
现在选择10.100.134.1为主服务器,要在10.100.134.2和10.100.134.3上面部署相同的服务
利用nginx来做负载均衡,在myserver.conf中添加配置项如下:
 
upstream xx {
        server 10.100.134.2 ;
        server 10.100.134.3 ;
}
server {
        listen       80;
        server_name  localhost;
 
        location / {
            proxy_pass  http://xx/;                                                                                            
            proxy_redirect default ;
        } 
}
现在重启nginx,访问http://10.100.134.1就相当于均衡的访问10.100.134.2和10.100.134.3
如果还想将主服务器也作为应用服务器,可以将10.100.134.1上面服务的监听端口改为非80端口,
比如8088,那么三台服务器一起作为应用服务器负载的nginx的配置为:
upstream xx {
        server 10.100.134.1:8088;
        server 10.100.134.2 ;
        server 10.100.134.3 ;
}
server {
        listen       80;
        server_name  localhost;
 
        location / {
            proxy_pass  http://xx/;                                                                                            
            proxy_redirect default ;
        } 
}
 
不同应用服务器session问题:
如果只作上面配置,在访问普通没有验证的页面是没啥问题的,但是如果每个应用服务器有session的话可就麻烦了,举个例子:
1.用户首先请求登录页面,这时候nginx把该请求定向到10.100.134.2服务器,那么登陆成功后10.100.134.2就在本地设置了session
2.这时候跳转到首页,这时候nginx把该请求定向到10.100.134.3服务器,服务器检查session,发现没有合法session,于是又跳转到登录页
 
 
 ip_hash
nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:

upstream xx {
        server 10.100.134.1:8088;
        server 10.100.134.2 ;
        server 10.100.134.3 ;
        ip_hash;
}

ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:

1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用 的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。
原文地址:https://www.cnblogs.com/candycloud/p/4898592.html