启动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
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;
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;
listen 80;
server_name localhost;
location / {
proxy_pass http://xx/;
proxy_redirect default ;
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;
listen 80;
server_name localhost;
location / {
proxy_pass http://xx/;
proxy_redirect default ;
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 {
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是有缺陷的,不能在一些情况下使用:
ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:
1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用 的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。