您的位置:首页 > 运维架构 > Nginx

Nginx服务器实际项目应用

2020-04-02 19:11 1186 查看

[TOC]

1. Nginx介绍及安装

1.1 官网下载

下载地址

下面教程使用的版本是:nginx-1.14.2.zip

1.2 在线安装

1.2.1 基础环境

nginx是C语言开发,建议在linux上运行,本教程使用Centos6.4作为安装环境。安装redis需要先将官网下载的源码进行编译,编译依赖gcc、PCRE、zlib、openssl环境。

yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

1.2.2 进行安装

01解压源码

02进入解压后的目录

03参数设置,安装到指定目录

04编译安装

tar -zxvf nginx-1.11.13.tar.gzcd /usr/local/nginx-1.11.13./configure --prefix=/usr/local/nginx --with-streammake && make install

1.2.3 nginx.conf

  1. HTTP服务反向代理
# 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;}# 配置了tcp负载均衡和udp(dns)负载均衡的例子stream {include ../server/stream/*.conf;}# HTTP服务代理(负载均衡、反向代理)http {include ../server/http/*.conf;include       mime.types;default_type  application/octet-stream;sendfile        on;# keepalive_timeout  0;keepalive_timeout  65;}
  1. HTTPS配置
# 开启缓存proxy_cache_path cache levels=1:2 keys_zone=my_cache:10m;# 通过http访问httpsserver {listen       80 default_server;listen       [::]:80 default_server;server_name  test.com;return 302 https://$server_name$request_uri;}# 配置https和反向代理server {# https的默认端口是443listen       443;server_name  test.com;# 公钥私钥生成命令(生成的证书会提示不安全):openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout localhost-privkey.pem -out localhost-cert.pemssl on;ssl_certificate_key  ../certs/localhost-privkey.pem;ssl_certificate      ../certs/localhost-cert.pem;location / {proxy_cache my_cache;proxy_pass http://127.0.0.1:8888;proxy_set_header Host $host;}}# http2配置(chrome://net-internals中可以查看http2;https://http2.akamai.com/demo/http2-lab.html可以比较性能)server {listen       443 http2;server_name  test.com;http2_push_preload  on;ssl on;ssl_certificate_key  ../certs/localhost-privkey.pem;ssl_certificate      ../certs/localhost-cert.pem;location / {proxy_cache my_cache;proxy_pass http://127.0.0.1:8888;proxy_set_header Host $host;}}
  1. server节点配置
server {listen 8081;# 前台页面location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff|ttf)$ {root   /home/www/;index  index.html login.html;}# 后台服务(URL中是否包含有URI,包含/是替换,不包含/是追加)location /isp/ {proxy_pass http://10.237.16.21:7122/;}}
  1. stream节点配置
server {listen 8082;proxy_pass unix:/tmp/stream.socket;}
  1. Upstream节点配置
# 方式一upstream proxy_server01 {server 192.168.1.1:8001;server 192.168.1.2:8001;server 192.168.1.3:8001;server 192.168.1.4:8001;}# 方式二upstream proxy_server02 {server http://192.168.1.1:8001/;server http://192.168.1.2:8001/;server http://192.168.1.3:8001/;server http://192.168.1.4:8001/;}http {server {listen 80;server_name aaa.com;location / {proxy_pass http://proxy_server01;}}server {listen 81;server_name bbb.com;location /server/ {proxy_pass proxy_server02;}}}
  1. root和alias区别

一般情况下,在location /中配置root,在location /other中配置alias是一个好习惯。

location /c/ {alias /a/}注:如果访问站点http://location/c访问的就是/a/目录下的站点信息,末尾必须加“/”。location /c/ {root /a/}注:如果访问站点http://location/c访问的就是/a/c目录下的站点信息,末尾“/”加不加无所谓。

1.3 离线安装

把安装包解压到服务器上,先安装gcc,再安装g++。分别执行两个文件夹下的install.sh。
一般我们都需要先装pcre,zlib,前者用于url rewrite,后者用于gzip压缩,openssl用于后续可能升级到https时使用。

1.3.1 pcre安装

tar -zxvf pcre-8.42.tar.gzcd pcre-8.42/./configuremake && make install

1.3.2 zlib安装

1.3.3 openssl安装

tar -zxvf openssl-1.1.0h.tar.gzcd openssl-1.1.0h/./configmake && make install

1.3.4 nginx安装

tar -zxvf nginx-1.14.0.tar.gzcd nginx-1.14.0/./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=../pcre-8.42 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.0hmake && make install

1.4 启动使用

直接运行bin/redis-server将以前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法。

1.4.1 基本命令

进入安装目录,不是源码目录:/usr/local/nginx检查配置文件:./nginx -t首次启动:./nginx -c conf/nginx.conf停止:./nginx -s stop从新加载配置:./nginx -s reload

1.4.2 开机启动

# Nginx服务开机启动nginx.service[Unit]Description=nginx - high performance web serverAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s stop

2. 业务使用

2.1 动静分离部署

2.1.1 前台页面配置

var baseUrl = "192.168.100.12:11601";

注意:此处是配置Nginx的地址,不是后台部署服务的地址。

2.1.2 Nginx配置

  1. 全局总配置文件nginx.conf

注意:测试为了以后添加方便进行配置分离,完全可以都写在一个文件中。

#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;include ../server/file/*.conf;include ../server/http/*.conf;}
  1. 动静分离配置,在/usr/local/nginx/server/http目录下配置文件test.conf,名字随意,根据业务自行修改。
server {listen 8999;# 前台页面location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff|ttf)$ {root   /home/kaifa/test/;index  index.html login.html;}# 后台服务(URL中是否包含有URI,包含/是替换,不包含是追加)location /test/ {proxy_pass http://192.168.100.12:11601/;# nginx默认文件上传是2Mclient_max_body_size    50m;}}

2.2 Nginx文件上传

可以直接使用spring boot中自带的静态资源访问文件。

2.2.1 Java后台配置

  1. 例如上传图片文件,在spring boot项目中的application.yml配置路径。
image:imgUrl: http://192.168.100.12:8000/imgPath: /home/kaifa/resource/
  1. 提倡配置使用@ConfigurationProperties管理配置
// TODO 待完善,下面代码还使用@Value形式。
  1. 文件上传工具类(涉及代码较多,仅列举核心代码)
/*** project -** @author guod* @version 1.0* @date 日期:2018/8/7 时间:17:46* @JDK 1.8* @Description 功能模块:文件上传功能*/@RestController@RequestMapping(value = "/file")public class FileUploadUtils {private Logger logger = LoggerFactory.getLogger(getClass());@Value("${image.imgUrl}")private String imgUrl;@Value("${image.imgPath}")private String imgPath;/*** 功能描述:提取上传方法为公共方法** @param uploadDir 上传文件目录* @param file      上传对象* @throws Exception*/private String executeUpload(String uploadDir, MultipartFile file) throws Exception {//文件后缀名String suffix = file.getOriginalFilename().substring(Objects.requireNonNull(file.getOriginalFilename()).lastIndexOf("."));//上传文件名String filename = UUID.randomUUID() + suffix;//服务器端保存的文件对象File serverFile = new File(uploadDir + filename);// 将上传的文件写入到服务器端文件内// file.transferTo(serverFile);FileUtils.copyInputStreamToFile(file.getInputStream(), serverFile);// 返回用户回显路径String returnFile = uploadDir + filename;logger.info("服务器图片地址:[{}]", serverFile);return returnFile;}/*** 功能描述:上传单个文件方法(多文件上传此处不再列举)** @param file 前台上传的文件对象(注解请求头信息:enctype=multipart/form-data)* @return*/@PostMapping(value = "/upload")public Json upload(HttpServletRequest request, MultipartFile file) {String returnImage = null;try {String format = new SimpleDateFormat("yyyy/MM/dd/").format(new Date());String uploadDir = imgPath + format + "upload/";logger.info("传的路径[{}]", uploadDir);//如果目录不存在,自动创建文件夹File dir = new File(uploadDir);if (!dir.exists()) {boolean mkdirs = dir.mkdirs();}//调用上传方法returnImage = executeUpload(uploadDir, file);} catch (Exception e) {//打印错误堆栈信息e.printStackTrace();return ResultUtils.errorJson("-200", "上传失败!");}return ResultUtils.successJson(returnImage);}/*** 功能描述:显示图片接口** @param response* @throws Exception*/@RequestMapping(value = "/image", method = RequestMethod.GET)public void imageDisplay(HttpServletResponse response) throws Exception {// 文件业务逻辑自行处理,替换下面File file = new File("/home/kaifa/resource/2019/02/18/upload/9a9bf096-ab71-                                                            48b3-93fd-b68f3ce255d6.png");// 进行文件下载的指定,设置强制下载不打开OutputStream outputStream = response.getOutputStream();// 设置显示图片response.setContentType("image/jpeg");// 设置缓存response.setHeader("Cache-Control", "max-age=604800");// outputStream写入到输出流outputStream.write(FileCopyUtils.copyToByteArray(file));outputStream.flush();outputStream.close();}/*** 功能描述:下载文件** @param response* @throws IOException*/@RequestMapping(value = "/downloadFile")public void downloadFile(HttpServletResponse response) throws IOException {// 文件业务逻辑自行处理,替换下面File file = new File("/home/kaifa/resource/2019/02/18/upload/9a9bf096-ab71-                                                           48b3-93fd-b68f3ce255d6.png");OutputStream outputStream = response.getOutputStream();// 进行文件下载的指定response.setContentType("application/x-download");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + new String(("下载名称").getBytes("gbk"), "iso8859-1") + ".xls");// outputStream写入到输出流outputStream.write(FileCopyUtils.copyToByteArray(file));outputStream.flush();outputStream.close();}/*** 功能描述:直接返回文件流(简略书写,根据业务进行修改)** @param path* @return* @throws Exception*/@RequestMapping(value = "/showFile")public ResponseEntity<byte[]> showFile(@RequestParam("path") String path)throws Exception {if (StringUtils.isEmpty(path)) {return null;}String filepath = path;URL url = new URL(filepath);ResponseEntity r;try {byte[] bytes1 = IOUtils.toByteArray(url.openConnection().getInputStream());MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(org.springframework.util.StringUtils.getFilename(filepath), "utf-8"));r = new ResponseEntity(bytes1, headers, HttpStatus.OK);return r;} catch (Exception e) {e.printStackTrace();}return null;}}

2.2.2 Nginx配置

  1. 在/usr/local/nginx/server/file目录下配置文件file.conf,名字随意,下面配置根据业务自行修改。
server {listen  8000;location / {root /home/kaifa/resource/;}}

下次分享:Nginx+Keepalived 实现主备切换

  • 点赞
  • 收藏
  • 分享
  • 文章举报
guod369发布了52 篇原创文章 · 获赞 0 · 访问量 300私信关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: