一、Linux安裝NGINX
在Centos下,yum來源不提供nginx的安裝,可以透過切換yum來源的方法取得安裝。也可以直接下載安裝套件的方法,以下指令皆需root權限執行:先安裝必要的函式庫(nginx中gzip模組需要zlib函式庫,rewrite模組需要pcre函式庫,ssl功能需要openssl函式庫)。選定/usr/local為安裝目錄,以下特定版本號依實際變更。
1.1、安裝PCRE函式庫
$ cd /usr/local/ $ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz $ tar -zxvf pcre-8.36.tar.gz $ cd pcre-8.36 $ ./configure $ make $ make install
./configure錯誤(建議學習:nginx教學)
configure: error: You need a C++ compile r for C++ support.
解決方法:yum install -y gccgcc-c
##1.2、安裝zlib函式庫
$ cd /usr/local/ $ wget http://zlib.net/zlib-1.2.8.tar.gz $ tar -zxvf zlib-1.2.8.tar.gz $ cd zlib-1.2.8 $ ./configure $ make $ make install
1.3、安裝ssl
$ cd /usr/local/ $ wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz $ tar -zxvf openssl-1.0.1j.tar.gz $ ./config $ make $ make install
#1.3、安裝NGINX##$ cd /usr/local/
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar -zxvf nginx-1.8.0.tar.gz
$ cd nginx-1.8.0
$ ./configure --prefix=/usr/local/nginx
$ make
$ make install
安裝常見錯誤:
Nginx啟動提示找不到libpcre.so.1解決方法
如果是32位元系統
[root@lee ~]# ln -s /usr/local/lib/libpcre.so.1 /lib
如果是64位元系統
[root@lee ~]# ln -s /usr/local/lib/libpcre.so.1 /lib64
然後在啟動nginx就OK了
[root@lee ~]# /usr/local/webserver/nginx/sbin/nginx1.4、啟動NGINX
$ /usr/local/nginx/sbin/nginx
開啟瀏覽器存取此機器的IP,如果瀏覽器出現Welcome to nginx! 則表示Nginx已經安裝並運行成功。
重启:
$ /usr/local/nginx/sbin/nginx 启动命令
重启:
$ /usr/local/nginx/sbin/nginx –s reload
停止:
$ /usr/local/nginx/sbin/nginx –s stop
测试配置文件是否正常:
$ /usr/local/nginx/sbin/nginx –t
强制关闭:
$ pkillnginx
3.1、什麼是Keepalived
Keepalived是一個免費開源的,用C編寫的類似於layer3, 4 & 7交換機制軟體,具備我們平時說的第3層、第4層和第7層交換機的功能。主要提供
loadbalancing(負載平衡)和 high-availability(高可用)功能,負載平衡實現需要依賴Linux的虛擬服務核心模組(ipvs),而高可用是透過VRRP協定實現多台機器之間的故障轉移服務。
上圖是Keepalived的功能體系結構,大致分為兩層:使用者空間(user space)和核心空間(kernel space)。
核心空間:主要包含IPVS(IP虛擬伺服器,用於實現網路服務的負載平衡)和NETLINK(提供進階路由及其他相關的網路功能)兩個部份。
使用者空間:
WatchDog:負載監控checkers與VRRP行程的狀況下載keepalived網址:http://www.keepalived.org/download.html
##解壓縮安裝:tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/ yum install -yopensslopenssl-devel(需要安装一个软件包) cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived make&& make install
3.3、將Keepalived安裝成Linux系統服務
将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作: 首先创建文件夹,将keepalived配置文件进行复制: mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ 然后复制keepalived脚本文件: cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ ln -s /usr/local/sbin/keepalived /usr/sbin/ ln -s /usr/local/keepalived/sbin/keepalived /sbin/ 可以设置开机启动:chkconfigkeepalived on,到此我们安装完毕!3.4、Keepalived常用指令
servicekeepalived start servicekeepalived stop
##
<span style="color: #000000;">! Configuration File for keepalived global_defs { router_id bhz005 ##标识节点的字符串,通常为hostname } ## keepalived会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,也就是由100 - 20 <br>变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。 如果脚本执行结果为0并且weight配置的值大于0,则优先级会相应增加。 如果脚本执行结果不为0 并且weight配置的值小于0,则优先级会相应减少。 vrrp_scriptchk_nginx { script "/etc/keepalived/nginx_check.sh" ##执行脚本位置 interval 2 ##检测时间间隔 weight -20 ## 如果条件成立则权重减20(-20) } ## 定义虚拟路由 VI_1为自定义标识。 vrrp_instance VI_1 { state MASTER ## 主节点为MASTER,备份节点为BACKUP ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth6) interface eth6 virtual_router_id 172 ## 虚拟路由ID号 mcast_src_ip 192.168.1.172 ## 本机ip地址 priority 100 ##优先级配置(0-254的值) Nopreempt ## advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s authentication { auth_type PASS auth_passbhz ## 真实生产环境下对密码进行匹配 } track_script { chk_nginx } virtual_ipaddress { 192.168.1.170 ## 虚拟ip(vip),可以指定多个 } }</span>##、 Keepalived的設定
4.1、設定NGINX的主備自動重啟
1、對設定檔進行修改:vim /etc /keepalived/keepalived.conf
1)修改master NGINX配置! Configuration File for keepalived global_defs { router_id bhz006 } vrrp_scriptchk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface eth7 virtual_router_id 173 mcast_src_ip 192.168.1.173 priority 90 ##优先级配置 advert_int 1 authentication { auth_type PASS auth_passbhz } track_script { chk_nginx } virtual_ipaddress { 192.168.1.170 } }2)修改Backup NGINX配置
#!/bin/bash A=`ps -C nginx–no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killallkeepalived fi fi3)nginx_check.sh 腳本
/usr/local/nginx/sbin/nginx servicekeepalived start ps -ef | grepnginx ps -ef | grepkeepalived
949a265f4ecf2de05455fc66d0b4c6e4 b4b38e33757a6497aa8690936b905cc1 05a8acc5c31084a4f61ade01873802caorg.springframework.boot192ca2f7b8c770b01c8f81e6bdd5b947 9bc4cbb67f66e148869423c0d27e5f90spring-boot-starter-redisb68fb17cb904a46b73e6272850323873 09a0e22e5aaafd848ae04665be625b91 706be6ab47249fb2329193d8a72593e2 b4b38e33757a6497aa8690936b905cc1 05a8acc5c31084a4f61ade01873802caorg.springframework.session192ca2f7b8c770b01c8f81e6bdd5b947 9bc4cbb67f66e148869423c0d27e5f90spring-session-data-redisb68fb17cb904a46b73e6272850323873 09a0e22e5aaafd848ae04665be625b91
五、集群情況下Session共享解決方案
#5.1、在集群情況下session會產生什麼原因?由於session存放在伺服器端,叢集下使用者可能存取不同的伺服器,則可能session無法共用。 5.2、Session共享解決方案###1)NGINX做的负载均衡可以绑定ip_hash,从而使同一个IP访问同一个服务器 ------------------该方案使得集群失去意义。
2)利用数据库同步session----------------------太过复杂
3)利用cookie同步session(保存一个session到本地,再次访问将其带到服务器端)----------------------安全性差、http请求都需要带参数增加了带宽消耗
4)使用session集群,存放到redis中(spring-session)
5.3、spring-session项目,解决session共享问题
949a265f4ecf2de05455fc66d0b4c6e4 b4b38e33757a6497aa8690936b905cc1 05a8acc5c31084a4f61ade01873802caorg.springframework.boot192ca2f7b8c770b01c8f81e6bdd5b947 9bc4cbb67f66e148869423c0d27e5f90spring-boot-starter-redisb68fb17cb904a46b73e6272850323873 09a0e22e5aaafd848ae04665be625b91 706be6ab47249fb2329193d8a72593e2 b4b38e33757a6497aa8690936b905cc1 05a8acc5c31084a4f61ade01873802caorg.springframework.session192ca2f7b8c770b01c8f81e6bdd5b947 9bc4cbb67f66e148869423c0d27e5f90spring-session-data-redisb68fb17cb904a46b73e6272850323873 09a0e22e5aaafd848ae04665be625b91
创建SessionConfig
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; //这个类用配置redis服务器的连接 //maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒) @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800) Public class SessionConfig { // 冒号后的值为没有配置文件时,制动装载的默认值 @Value("${redis.hostname:localhost}") String HostName; @Value("${redis.port:6379}") int Port; @Bean Public JedisConnectionFactory connectionFactory() { JedisConnectionFactory connection = new JedisConnectionFactory(); connection.setPort(Port); connection.setHostName(HostName); return connection; } }
初始化Session
//初始化Session配置Public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{ Public SessionInitializer() { super(SessionConfig.class); } }
控制层代码
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestControllerpublic class SessionController { @Value("${server.port}") private String PORT; @RequestMapping("/index") public String index() { return "index:" + PORT; } /** * @methodDesc: 功能描述:(往session存放值) */ @RequestMapping("/setSession") public String setSession(HttpServletRequest request, String sessionKey, String sessionValue) { HttpSession session = request.getSession(true); session.setAttribute(sessionKey, sessionValue); return "success,port:" + PORT; } /** * @methodDesc: 功能描述:(从Session获取值) */ @RequestMapping("/getSession") public String getSession(HttpServletRequest request, String sessionKey) { HttpSession session =null; try { session = request.getSession(false); } catch (Exception e) { e.printStackTrace(); } String value=null; if(session!=null){ value = (String) session.getAttribute(sessionKey); } return "sessionValue:" + value + ",port:" + PORT; } }
六、高并发解决方案
业务数据库 -》 数据水平分割(分区分表分库)、读写分离
业务应用 -》 逻辑代码优化(算法优化)、公共数据缓存
应用服务器 -》 反向静态代理、配置优化、负载均衡(apache分发,多tomcat实例)
系统环境 -》 JVM调优
页面优化 -》 减少页面连接数、页面尺寸瘦身
动态资源和静态资源分离
CDN加速
服务分布式部署
以上是Linux下NGINX實作高可用的詳細內容。更多資訊請關注PHP中文網其他相關文章!