当前位置: 首页 > 工具软件 > django-taobao > 使用案例 >

服务器配置Django+Nginx+Uwsgi+MySQL

太叔繁
2023-12-01

一、安装anaconda

1.1下载安装包

sudo wget -P /home/ubuntu/Downloads/ https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh

我们可以换清华源来提高下载速度

sudo wget -P /home/ubuntu/downloads/ https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2020.11-Linux-x86_64.sh

此时的安装位置是可以切换的,我们记住当前的下载位置,别到时候找不到安装包了

可以验证安装包的hash值已确定其完整性,此网站可以看其正确的哈希值

sha256sum /home/ubuntu/Downloads/e/Anaconda3-2020.11-Linux-x86_64.sh

1.2安装

bash /home/ubuntu/downloads/Anaconda3-2020.11-Linux-x86_64.sh

在Ubuntu20环境下安装到了 ~/anaconda3的目录下

1.3换源

vim ~/.condarc

default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2

1.4配置环境

我们发现此时conda命令并不能使用,因为我们还需要配置环境

vim打开 ~/.bashrc在最后面加上路径,当然如果安装到了别的位置,我们需要添加别的位置的PATH

export PATH=$PATH:~/anaconda3/bin

二、安装Nginx

2.1安装

sudo apt-get install nginx

2.2配置

在ubuntu20下,Nginx的配置文件在 /etc/nginx/nginx.conf

http{
    upstream django {
 		# 这里我们指定8000端口,这个端口外部访问不到
    	# server 127.0.0.1:8000
    	# 也可以用文件,二选一
		server unix:///home/ubuntu/web/hello/hello.sock
	}	
    
    server {
        # 服务监听端口
        listen          80;
        # 域名或者公网IP
        server_name     http://www.baidu.com;
        # 字符集
        charset         utf-8;
        
        location /static {
            alias   /home/ubuntu/static/;
        }
        location / {
            uwsgi_pass   django;
            # 导⼊uwsgi配置
            include      /etc/nginx/uwsgi_params;
        }
	} 
}

  1. 12345 是nginx监听的端口号;
  2. 配置中的路由 /tst/也会自动拓展到路径之下。比如服务器ip为123.123.123.123, 当访问http://123.123.123.123:80/static/时,nginx会将/static/拼接到设置的路径 /home/download/之下,这样就会访问 /home/download/static/目录下的文件。

每次配置完毕都需要重启一下

nginx -s reload

或者

service nginx restart
# 查看状态
service nginx status
# 启动
service nginx start
# 停止
service nginx stop

此时我们在 /home/ubuntu/static中创建我们的静态文件,我们发现已经可以从外网访问了,要是你看不到,去释放一下自己的80端口(访问安全组,让自己的80端口是可以访问的)

2.3无法访问uwsgi_params

我们需要在 /etc/nginx/这个路径下创建这个文件,当然我们也可以在别的路径下,只要我们在 nginx.conf这个文件中写好路径

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

3.5访问出现403没有权限的问题

找到nginx.conf,将第⼀⾏的代码进⾏修改

# user www-data;
user root;
# 或者将 www-data更改权限

此刻就可以访问了

三、安装Uwigs

Uwsgi可以将用户输入域名的行为映射到内网,域名映射-域名端口映射-域名映射到内网ip

最好先安装这个,要不装不上,很奇怪的问题

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-dev
sudo apt-get install uwsgi

还有一个安装不上的解决方案没试过,不知道可以不可以

需要注意的是pip install uwsgi 要加上–no-cache-dir,pip 可以强制下载重新编译安装的库,不然pip会直接从缓存中拿出了上次编译后的 uwsgi 文件,并没有重新编译一份。

pip uninstall uwsgi
sudo apt-get install libpcre3 libpcre3-dev
pip install uwsgi --no-cache-dir

3,1配置Uwigs

uconfig.ini

[uwsgi]
# 项目根目录
chdir   = /home/ubuntu/web/hello/
# wsgi.py的目录
module  = hello.wsgi
master  = true
processes = 4
# socket = 127.0.0.1:8000
socket = /home/ubuntu/web/hello/hello.sock
chmod-socket = 666
vacuum = true
daemonize = /home/ubuntu/web/hello/uwsgi.log

3.2测试Uwsgi

我们写一个test.py文件

def application(env, start_response):
	start_response('200 OK', [('Content-Type','text/html')])
	return [b"Hello World"]

然后我们测试一下

uwsgi --http :8000 --wsgi-file test.py

我们发现现在我们是可以用我们的公网ip+端口访问的,可以得到hello word

现在我们启动我们的Django项目

# 到项目根目录
cd /home/ubuntu/web/hello
# 启动UWSGI,本身并没有hello.wsgi这个文件,这样写的意思是hello项目下的wsgi.py
uwsgi --http :8000 --module hello.wsgi

此时我们打开浏览器发现,我们是可以访问我们django项目中的界面的,但是我们需要加上8000端口

3.3和Nginx联动

我们启动我们的django在8000端口,前面我们的nginx已经代理了这个端口

uwsgi --socket :8000 --module hello.wsgi

我们现在发现我们django的主页已经可以由nginx传出了,也就是说我们可以直接通过IP访问我们的django了

此时我们也可以设置自己的sock的套接字为unix文件形式

uwsgi --socket hello.sock --module hello.wsgi --chmod 666

此处的hello.sock和我们在2.2配置的hello.sock要保持一致

3.4直接用配置文件启动

uwsgi --ini uconfig.ini

得到下面的命令说明启动成功sh

[uWSGI] getting INI configuration from uconfig.ini

ps aux可以查看到uwsgi

3.5关闭Uwsgi进程

pkill -f uwsgi -9

3.6一点对ini配置文件的解释

[uwsgi]
# 虚拟环境目录加项目文件夹,django项目的根目录,同名目录的外层
chdir = /var/www/datavis/firstapp
# django项目同名目录内层自动生成的wsgi.py的路径,如果你的项目叫taobao,就填taobao.wsgi
module = firstapp.wsgi
# 指定虚拟环境,如果没有使用虚拟环境可以不用指定
home = /var/www/datavis
# 启动主进程
master = true
# 最大进程数量
processes = 4
# 停止uwsgi时自动清理
vacuum = true
# django项目运行的端口号 这个时候直接对接nginx,将网站对接到http的域名下
# socket = 127.0.0.1:8000
# socket的设置要和nginx保持一致
socket = /home/ubuntu/web/hello/hello.sock
# 给足够的权限
chmod-socket = 666
# 指定后台输出日志信息的文件,如果遇到不能正常使用,可以使用cat /var/log/uwsgi_log.log查看报错信息
daemonize = /var/log/uwsgi_log.log
# 指定运行时候的pid文件,也可以用来停止进程, uwsgi --stop /var/run/uwsgi_pid.log
pidfile = /var/run/uwsgi_pid.log

四、安装MySQL

sudo apt-get update
sudo apt install mysql-server

4.1初始化配置

sudo mysql_secure_installation

配置项较多,如下所示:

#1
VALIDATE PASSWORD PLUGIN can be used to test passwords...
Press y|Y for Yes, any other key for No: N (选择N ,不会进行密码的强校验)

#2
Please set the password for root here...
New password: (输入密码)
Re-enter new password: (重复输入)

#3
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : N (选择N,不删除匿名用户)

#4
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : N (选择N,允许root远程连接)

#5
By default, MySQL comes with a database named 'test' that
anyone can access...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : N (选择N,不删除test数据库)

#6
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y (选择Y,修改权限立即生效)

4.2检查MYSQL服务

systemctl status mysql.service

4.3配置远程访问

在Ubuntu下MySQL缺省是只允许本地访问的

#找到 bind-address 修改值为 0.0.0.0(如果需要远程访问)
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
#重启mysql
sudo /etc/init.d/mysql restart 

登录mysql

sudo mysql -uroot -p
#切换数据库
use mysql;
#查询用户表命令:
select User,authentication_string,Host from user;
#查看状态
select host,user,plugin from user;
#允许远程访问
mysql> UPDATE user SET host = '%' WHERE user = 'root'; 
#刷新cache中配置 刷新权限
flush privileges; 
#退出
quit;

其中root@localhostlocalhost就是本地访问,配置成 % 就是所有主机都可连接;

五、Django配置

settings文件,在allow_hosts里面加上自己的服务器的公网ip,和允许访问的域名

六、一些Linux指令

# 查看端口占用信息
netstat -apn  #查看所有的进程
netstat -nltp  #查看所有的被占用的端口的进程
kill -9   掉自己不想要的程序
 类似资料: