openresty (nginx)快速开始

文章目录

    • 一、什么是openresty?
    • 二、openresty编译安装
      • 1. 编译安装命令
        • 1.1 编译完成后路径
        • 1.2 常用编译选项解释
      • 2. nginx配置文件配置
        • 2.1 nginx.conf模板
      • 3. nginx常见配置
        • 一个站点配置多个域名
        • nginx配置中location匹配规则
    • 三、OpenResty工作原理
      • OpenResty工作原理
      • OpenResty处理请求流程
      • Nginx架构 的 好处
      • ngx_lua
      • 协程
      • NIO编程(同步阻塞与同步非阻塞详解)
    • 四、工作遇坑细节总结
      • inlude相对路径、lua相对路径问题
      • access_log 和 error_log有什么区别

一、什么是openresty?

官网: https://openresty.org/cn/

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其**内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。**用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

总结:openresty 内部已经帮你集成了许多依赖项,编译时只需要–with-xxx 激活这些依赖模块。

二、openresty编译安装

官网参考: https://openresty.org/cn/installation.html

安装路径 选择 /usr/local/openresty,如果不配置安装路径,默认安装路径即 /usr/local/openresty
因为公司准生产 使用的是 1.9.15.1

单纯编译openresty比较简单,openresty强大在很多第三方拓展模块,你需要提前下载好这些模块源码,在配置 openresty编译选项时,把这些模块加进来。当然openrest以及集成大量模块,直接可以使用–with-xxx编译加入这些模块。

1. 编译安装命令

相关命令如下:

tar -zxvf openresty-1.13.6.2.tar.gz

## --with-http_ssl_module依赖openssl
yum install openssl openssl-devel

export INSTALL_DIR=/usr/local/openresty

./configure --prefix=${INSTALL_DIR} --sbin-path=${INSTALL_DIR}/nginx/sbin/nginx --conf-path=${INSTALL_DIR}/nginx/conf/nginx.conf --pid-path=${INSTALL_DIR}/nginx/logs/nginx.pid --lock-path=${INSTALL_DIR}/nginx/logs/nginx.lock --user=root --group=root --with-luajit --without-http_redis2_module --with-http_iconv_module --with-stream --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_auth_request_module --with-pcre --with-pcre-jit --with-debug --with-http_v2_module


gmake
gmake install
1.1 编译完成后路径

安装完成后,nginx命令路径为
/usr/local/openresty/nginx/sbin/nginx
配置文件路径
/usr/local/openresty/nginx/conf/nginx.conf
/usr/local/openresty/nginx/conf/http_vhost/.conf
/usr/local/openresty/nginx/conf/http_upstream/
.conf

# nginx重载
/usr/local/openresty/nginx/sbin/nginx -s reload
1.2 常用编译选项解释
  • –with-stream
    ngx_stream_core_module模块自1.9.0版开始提供。默认情况下不构建此模块,应使用–with-stream 配置参数启用它。用来实现四层协议的转发、代理或者负载均衡等。stream 模块用于一般的 TCP 代理和负载均衡。

  • –with-http_ssl_module
    Nginx虚拟主机、Nginx模块的安装使用(加密模块–with-http_ssl_module)
    参考URL: https://blog.csdn.net/weixin_41619143/article/details/88429027

    报错: SSL moudules require the OpenSSL library
    解决,执行

    yum -y install openssl openssl-devel
    
  • –with-http_realip_module
    这个模块主要功能就是 在nginx访问日志中去除代理IP,显示客户的真实IP。作用呢,一般就是统计客户地域或写个统计脚本看有没有流量攻击。

然后nginx.conf中
在这里加上"http_x_forwarded_for"’ 段,获取真实IP用的 log_format main ’

HTTP模块,不要在server中用,要在HTTP区用。这样就是全局使用。

  • –with-http_v2_module
    支持http2协议。

2. nginx配置文件配置

## 复制配置好的nginx.conf到conf目录 ${INSTALL_DIR}为你前面定义的安装目录
cp -rf nginx.conf ${INSTALL_DIR}/nginx/conf/
# 修改nginx.conf中的工作线程数为CPU核数
CPU_NUM=`cat /proc/cpuinfo | grep processor|wc -l | awk -F' ' '{print $NF}' | sed -n '$p'`
sed -i "s/^worker_processes.*/worker_processes ${CPU_NUM};/g" ${INSTALL_DIR}/nginx/conf/nginx.conf

创建nginx日志目录(你的nginx.conf中配置的,这里创建好目录)

# create nginx logs dirtory
mkdir -p /home/logs/nginx
2.1 nginx.conf模板
# nginx的工作进程运行时的身份,也就是进程文件的属主和属组属性,如果在源码安装时configure配置已经指定用户和组,这里可以注释掉
#user  root;
# 定义nginx的工作进程的数量,一般为CPU核数或核数的倍数,该参数与并发量有关
worker_processes 4;
#worker_cpu_affinity 0001 0010 0100 1000;

# 错误日志的位置
error_log  /home/logs/nginx/error.log  error;
# nginx的master进程的pid存储文件
pid        /usr/local/openresty/nginx/logs/nginx.pid;

worker_rlimit_nofile 307200;

events {
    use epoll;
     # 每一个工作进程可以接收的请求连接数,一般与系统的进程可以打开的文件描述符数量相同,
    worker_connections 51200;
}

#流模块
stream {
    include tcp_vhost/*.conf;
    include tcp_upstream/*.conf;
}
http {
    # mime.types文件含有nginx支持的媒体类型,include可以加载该文件
    include    mime.types;
    include    fastcgi.conf;
    
    # 访问日志的格式,可以自定义
    log_format main     '$remote_addr $host $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" "$upstream_response_time" "$upstream_addr" "$upstream_status" "$request_time"';

     # 指定访问日志的位置和格式main
    access_log off;
    client_header_buffer_size 64k; 
    large_client_header_buffers 8 64k;
    client_max_body_size 500m;
 
    proxy_next_upstream error timeout invalid_header http_502 http_504;

    # 调用系统的方法传输文件,速度更快,
    sendfile     on;
    tcp_nopush   on;
    
    keepalive_requests 10000;
    keepalive_timeout 10;
    ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
     # 隐藏nginx版本号,不再浏览显示
    server_tokens off;
    
    include http_vhost/*.conf;
    include http_upstream/*.conf;

    lua_package_path 'lua/?.lua;../lua/?.lua;/usr/local/openresty/nginx/conf/lua/?.lua;/usr/local/openresty/lualib/?.lua;;';
}

注意: 配置文件中的相对路径,是当前nginx.conf同级目录,注意理解。

比如

include http_vhost/*.conf;
include http_upstream/*.conf;

对应路径为
/usr/local/openresty/nginx/conf/http_vhost
/usr/local/openresty/nginx/conf/http_upstream

3. nginx常见配置

Nginx常用配置有这一篇就够了
参考URL: https://baijiahao.baidu.com/s?id=1642243866657041522&wfr=spider&for=pc

一个站点配置多个域名
server {

listen 80;

server_name aaa.cn bbb.cn;

}

server_name 后跟多个域名即可,多个域名之间用空格分隔

nginx配置中location匹配规则

nginx配置中location匹配规则详解
参考URL: https://www.cnblogs.com/daiyacheng1991/archive/2019/09/04/11459133.html

nginx官方文档给出location语法如下:

location [=|~|~*|^~] uri { … }

其中,方括号中的四种标识符是可选项,用来改变请求字符串和uri的匹配方式。uri是待匹配的请求字符串,可以是不包含正则的字符串,这种模式被称为**“标准的uri";也可以包含正则,这种模式被称为"正则uri"**。

  • location = /uri
    = 开头表示精确匹配。

  • location ^~ /uri
    ^~ 开头对URL路径进行前缀匹配,并且在正则之前

  • location ~ 正则表达式
    ~开头表示区分大小写的正则匹配

  • location ~*正则表达式
    ~*开头表示不区分大小写的正则匹配

  • location /uri
    不带任何修饰符,也表示前缀匹配,但是在正则匹配之后

  • location /
    通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

如果匹配规则以^开头,就是匹配以指定字符串开头的路径,如果没有就是匹配url中的内容是否包含指定字符串
如果匹配规则以$结尾,就是匹配以指定字符串结尾的路径

多个location配置的情况下匹配顺序为(当有匹配成功时候,停止匹配,按当前匹配规则处理请求):

优先匹配 =
其次匹配 ^~
按照文件中的匹配顺序执行
最后匹配 /
普通匹配(最长字符匹配)

总结为: (location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)

三、OpenResty工作原理

OpenResty工作原理

Nginx采用的是master-worker模型,也就是一个master进程管理多个worker进程,基本的事件处理都放在worker进程中,master进程负责全局初始化以及对worker进行的管理。

OpenResty中,每个worker进程使用一个LuaVM,当请求被分配到worker时,将在这个LuaVM中创建一个coroutine协程,协程之间数据隔离,每个协程都具有独立的全局变量。

在这里插入图片描述
Nginx设计为主进程和多个工作进程的工作模式,每个进程是单线程来处理多个连接,每个工作进程采用了非阻塞I/O来处理多个连接,从而减少线程上下文切换,从而实现高性能、高并发。因此,生产环境中会通过将CPU绑定给Nginx工作进程,从而提升性能。

OpenResty处理请求流程

Nginx会把一个请求分成不同阶段,第三方模块可以根据自己的行为,挂在到不同阶段中以达到自身目的。OpenResty采用了同样的特性,不同阶段有着不同的处理行为。

Nginx架构 的 好处

Nginx采用多进程模式,对于每个worker进程都是独立的,因此不需要加锁,所以节省了锁带来的性能开销。采用独立的进程的好处在于worker进程之间相互不会影响,当一个进程退出后,其他进程依然工作,以保证服务不会终端。

Nginx采用异步非堵塞的方式去处理请求,异步非堵塞就是当一个线程调用出现阻塞而等待时,其他线程可以去处理其他任务。

ngx_lua

ngx_lua是将Lua嵌入Nginx,让Nginx执行Lua脚本,并且高并发、非阻塞的处理各种请求。Lua内建协程,可以很好的将异步回调转换成顺序调用的形式。ngx_lua在Lua中进行的IO操作都会委托给Nginx的事件模型,从而实现非阻塞调用。开发者可以采用串行的方式编写程序,ngx_lua会自动的在进行阻塞的IO操作中终端,保存上下文,然后将IO操作委托给Nginx事件处理机制,在IO操作完成后,ngx_lua会恢复上下文,程序继续执行,这些操作都是对用户程序透明的。

每个Nginx的worker进程持有一个Lua解释器或LuaJIT实例,这个worker处理的所有请求共享这个实例每个请求的context上下文会被Lua轻量级的协程分隔,从而保证各个请求时独立的。

ngx_lua模块的原理

  • 每个工作进程worker创建一个Lua虚拟机(LuaVM),工作进程worker内部协议共享VM。
  • -每个Nginx I/O原语封装后注入Lua虚拟机,并允许Lua代码直接访问。
  • 每个外部请求都由一个Lua协程处理,协程之间数据隔离。
  • Lua代码调用I/O操作等异步时,会挂起当前协程,而不阻塞工作机进程。
  • I/O等异步操作完成时,还原相关协程相关协议的上下文,并继续运行。

协程

协程,又称微线程,纤程。英文名Coroutine。

协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。

子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。

所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。

子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。

Java语言里面解决并发问题靠的就是多线程,但线程是个重量级对象,不能频繁创建和销毁,且线程切换成本也很高,为了解决这个问题,java采用了线程池。Java没有官方的协程支持,不过有一些库可以支持,如:Quasar。而一些其他语言本身就支持协程,如:go就内置支持协程。

所谓的协程,可以理解为是一种轻量级的线程,它与线程的主要区别在于

a. 线程切换的过程是由系统内核完成,切换的过程中会进入到内核态。而协程则完全工作在用户态。

b. 线程是否发生切换是由操作系统决定的(抢占式调度),工作线程本身没有决定权。而协程的切换是需要工作协程主动放弃CPU,这样调度器才能让另外一个协程继续运行。

NIO编程(同步阻塞与同步非阻塞详解)

NIO编程(同步阻塞与同步非阻塞详解)
参考URL: https://blog.csdn.net/yswKnight/article/details/79347833

  • BIO与NIO
    IO为同步阻塞形式,NIO为同步非阻塞形式,NIO并没有实现异步,在JDK1.7后升级NIO库包,支持异步非阻塞模型NIO2.0(AIO)

  • BIO(同步阻塞式IO)
    同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

  • NIO(同步非阻塞式IO)
    同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理

  • AIO(异步非阻塞式IO)
    异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

  1. 什么是阻塞?
    应用程序在获取网络数据的时候,如果网络传输数据很慢,就会**一直等待,**直到传输完毕为止。

  2. 什么是非阻塞?
    应用程序直接可以获取已经准备就绪好的数据,无需等待。

同步时,应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一个方法上,直到数据准备就绪;或者采用轮训的策略实时检查数据的就绪状态,如果就绪则获取数据.

异步时,则所有的IO读写操作交给操作系统,与我们的应用程序没有直接关系,我们程序不需要关系IO读写,当操作系统完成了IO读写操作时,会给我们应用程序发送通知,我们的应用程序直接拿走数据极即可。

四、工作遇坑细节总结

inlude相对路径、lua相对路径问题

比如nginx启动如下:

/home/she/openresty/nginx/sbin/nginx -c /home/she/openresty/nginx/conf/nginx.conf

如下则配置中的include 指的就是当前配置nginx.conf所在的路径,即
/home/she/openresty/nginx/conf/http_vhost/*.conf

        include http_vhost/*.conf;
        include http_upstream/*.conf;

假如其中一个conf有配置如下: 那么这里的conf/lua/access_check.lua 是哪个路径呢?从刚才的经验来看,配置中写的相对路径都是相关该配置当前的路径

        location ~* /api/auth/([-_a-zA-Z0-9/]+) {
            access_by_lua_file conf/lua/access_check.lua;
        }

工作中,竟然发现 /home/she/openresty/nginx/conf/lua/access_check.lua 修改打印一直打不出来?

猜测思考:openresty找lua脚本位置,应该有一个配置查找路径有优先级。
经过百度,果然有配置项,lua_package_path可以配置openresty的文件寻址路径

        lua_package_path 'lua/?.lua;../lua/?.lua;/opt/openresty/nginx/conf/lua/?.lua;/opt/openresty/nginx/conf/lua/dialer/?.lua;;';

经过测试,配置生效。

access_log 和 error_log有什么区别

日志-nginx的access_log与error_log
参考URL: https://blog.csdn.net/ty_hf/article/details/55518070

  • access_log 访问日志
    access_log为访问日志,记录所有对apache服务器进行请求的访问,它的位置和内容由CustomLog指令控制,LogFormat指令可以用来简化该日志的内容和格式。
  • error_log 错误日志
    error_log为错误日志,记录下任何错误的处理请求,它的位置和内容由ErrorLog指令控制,通常服务器出现什么错误,首先对它进行查阅**,是一个最重要的日志文件**。

总结:
error_log 我们可以配置日志等级,我们的lua中的ngx.log打印日志就是根据日志级别打印到该配置项配置的文件路径中。
每个service配置项中,都可以配置自己的 access_log和error_log。从而每个服务看自己的access_log和error_log。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/383178.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现自定义标记

实现自定义标记 问题陈述 New Tech Book的高级管理层决定在其用JSP设计的应用程序的所有页面上显示版权信息。它们还要去如何向应用程序中添加JSP页面,可以重用显示版本信息的代码。公司的软件开发人员Jerry Smith决定用自定义标记来创建应用程序的这一部分。 解决方案 要解…

【数学建模】【2024年】【第40届】【MCM/ICM】【D题 五大湖的水位控制问题】【解题思路】

一、题目 (一) 赛题原文 2024 ICM Problem D: Great Lakes Water Problem Background The Great Lakes of the United States and Canada are the largest group of freshwater lakes in the world. The five lakes and connecting waterways const…

社区团购系统-UMLChina建模知识竞赛第5赛季第6轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。 如果有第4题,第4题为附加题&am…

SpringBoot3整合Knife4j

前置&#xff1a; 官网&#xff1a;快速开始 | Knife4j gitee&#xff1a;swagger-bootstrap-ui-demo: knife4j 以及swagger-bootstrap-ui 集成框架示例项目 - Gitee.com 1.依赖引入&#xff1a; ps&#xff1a;json处理需要引入相关包 <dependency><groupId>c…

sqli-labs-master靶场训练笔记(54-65|决战紫禁之巓)

2024.2.5 level-54 1、先判断类型和闭合类型 ?id1/0 #正常 证明不是数字型 ?id1 #错误 ?id1 -- a #正常 判断是 闭合 2、 判断列数 这里需要运气&#xff0c;但是根据前面50多关的经验直接猜测是3列 ?id-1 union select 1,2,3 -- a 3、爆表名&#xf…

leetcode:131.分割回文串

树形结构&#xff1a; 切割到字符串的尾部&#xff0c;就是叶子节点。 回溯算法三部曲&#xff1a; 1.递归的参数和返回值&#xff1a; 参数字符串s和startIndex切割线 2.确定终止条件&#xff1a; 当分割线到字符串末尾时到叶子节点&#xff0c;一种方案出现 3.单层搜索…

真、开源LLM-OLMo

论文&#xff1a;https://arxiv.org/pdf/2402.00838.pdf Weights https://huggingface.co/allenai/OLMo-7B Code https://github.com/allenai/OLMo Data https://huggingface.co/datasets/allenai/dolma Evaluation https://github.com/allenai/OLMo-Eval Adaptation http…

行业科普应用分享 | 用于安全和安保的仪器仪表

【前言】 物联网带来了对安全和安保的新要求。利用物联网&#xff0c;运营商可以从复杂和分布式的装置中获益。此外&#xff0c;自主系统在现代工业的运作中正变得越来越重要。 从制造业到农业&#xff0c;这些远程操作需要仪器提供持续监测&#xff0c;以提供安全和保障。这…

记录一次centos 使用selenium运行环境

这里写自定义目录标题 宝塔面板 安装 selenium安装google-chrome 宝塔面板 安装 selenium 安装google-chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本 google-chrome --version 下载对应chrome版本的chro…

uniapp微信小程序开发踩坑日记:Pinia持久化

如果你使用过Pinia&#xff0c;那你应该知道Pinia持久化插件&#xff1a;https://prazdevs.github.io/pinia-plugin-persistedstate/zh/ 但由于官方文档提供的说明并不是针对小程序开发&#xff0c;所以我们在使用这个插件实现uniapp小程序开发中Pinia持久化会出现问题 我在C…

java学习07---综合练习

飞机票 1.需求: 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来年4月&#xff09;头等舱7…

人力资源智能化管理项目(day05:角色管理)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 搭建页面结构 分页组件&#xff1a;设置layout&#xff0c;表示需要显示的内容&#xff0c;用逗号分隔&#xff0c;布局元素会依次显示。prev表示上一页&#xff0c;next为…

Ps:统计

Ps菜单&#xff1a;文件/脚本/统计 Scripts/Statistics 统计 Statistics脚本命令提供了一种高效的方法来处理和分析大量图像&#xff0c;使用户能够自动执行复杂的图像分析任务&#xff0c;并在多个图像间应用统计学方法。这个功能极大地扩展了 Photoshop 在科学研究、图像编辑…

ThreeDPose

还没跑: GitHub - moshoeu/ThreeDPoseModelDriver: 用3DPose骨骼位置驱动人形模型动画 GitHub - Doggerlas/3DPoseTracker: unity练手项目 https://github.com/digital-standard/ThreeDPoseTracker GitHub - xerifg/Real-time-3DposeTracking-Unity3D-UnityChan: capture hum…

Acwing 5469. 有效点对【正难则反+巧妙选择根节点】

原题链接&#xff1a;https://www.acwing.com/problem/content/5472/ 题目描述&#xff1a; 给定一个 n 个节点的无向树&#xff0c;节点编号 1∼n。 树上有两个不同的特殊点 x,y&#xff0c;对于树中的每一个点对 (u,v)(u≠v)&#xff0c;如果从 u 到 v 的最短路径需要经过…

C语言分钟计算

一.题目描述 给你同一天的两个时间(24小时制),求这两个时间内有多少分钟,保证第一个时间在第二个时间之前. 二.输入描述 输入两行,每行包括两个整数表示小时和分钟. 三.输出描述 输出分钟数. 四.示例 输入 10 10 11 05 输出 55 五.代码

【Linux中增加Nginx虚拟主机配置文件(conf.d)】后访问80端报403

在nginx.conf的http模块新增 include /etc/nginx/conf.d/*.conf; 后 重启nginx报403 处理办法&#xff1a; 1&#xff0c;如果nginx是root用户启动的 则需要 将nginx.config的user改为和启动用户一致 2.权限问题&#xff0c;如果nginx没有web目录的操作权限&#xff0c;也会出…

《21天精通IPv4 to IPv6》第3天:IPv6地址配置——如何为不同的系统配置IPv6?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【报错解决】-bash: export: `-8‘: not a valid identifier 不是有效的标识符

现象 一登陆就提示-bash: export: -8’: not a valid identifier 不是有效的标识符 问题出现的原因 设置字符集时多写了空格 [rootdb1 ~]# cat >>/etc/profile<<EOF export LANGen_US.UTF -8(-8前不应有空格) EOF 解决方法 cd /etc vi profile 把export带有-8的…

c++求三个数中最大数

#include<iostream> using namespace std; int main() { int a,b,c; cout<<"请输入三个数字"<<endl;//end后面为小写的L cin>>a>>b>>c; if(a>b&&a>c) cout<<"最大数为a:"<<a<<e…